Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1518667ybh; Thu, 23 Jul 2020 10:50:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxR0c4UQomFfYBK+BvJE2juze5gkkqiK26XXemyxGNXBAokH+uWaaMUtzyHtQ0s0pD+Gzp1 X-Received: by 2002:aa7:dd49:: with SMTP id o9mr3997009edw.92.1595526628442; Thu, 23 Jul 2020 10:50:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595526628; cv=none; d=google.com; s=arc-20160816; b=iscN9MFxSU2Sm7ff1S33/GEkjmG5QspEAjRsXuUb6wSBxSUFc29/pkEDT12vyMTfIz 0g/brxcDUHQrOf9vJ+9gqI9MAbI5Uf+CgEs6S71yEtfHeBz5vICXPNjt15XUlOdCtlWU mWJtNhZpeLgQjqOtsVQem+eucy/mSNttWEn+wHOaC/UqxEMpjOH+z5jOx0A6mZk9QwKW IhtqkViAopFafErTKCtAvEjgJkSlNpoyoyH5v8+atBLwWlCV9daIThPE/BntxDKItdq/ lBSgPbrB37QNDG7r9Ofbc0+lEAzyzFenESF4oy3kEHxkSJD/KQIAIHN1xqwC3pBO7fLv X2Dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=H314K5R2E1Oq1wT/uWx3EfHSO3JcLg/bif8sTtGlYso=; b=TS0Fl5jq8lSMitVu2ZTlraJALCly1MoDytlNqlHgApz/GKKd6Lnd3LYFWOuPyC2SCZ s9E8j1JVe0ZiscJv4MURLm6rXWqGW379ENmrEcjKf0zSCIlN/r9LTsEGJJk/ofDWMmnz 8HREFEmH+pB2db2zP3Yfpedy7eDaZ96MQI2LGZvrxjKy/dveWQxk8kYTc5YVQcvE8pHv XRKB/LN2Yd2Bds+ciKlpSQ8lp870lCjCq+RTphjXuttNjIYpEgrLTlpfjf5sN8ETKuA6 9XR7aTKDy4/I5tl3WiBua4QMIvK8L1px+BrCQMfSYwOW4Osp7h8ZyeIPu76tdNZ+7NEv iSRA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ispras.ru Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w18si2513412edx.276.2020.07.23.10.50.04; Thu, 23 Jul 2020 10:50:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ispras.ru Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728194AbgGWRqz (ORCPT + 99 others); Thu, 23 Jul 2020 13:46:55 -0400 Received: from mail.ispras.ru ([83.149.199.84]:42040 "EHLO mail.ispras.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726666AbgGWRqz (ORCPT ); Thu, 23 Jul 2020 13:46:55 -0400 Received: from hellwig.intra.ispras.ru (unknown [10.10.2.182]) by mail.ispras.ru (Postfix) with ESMTPS id 0D0AC40A2040; Thu, 23 Jul 2020 17:46:52 +0000 (UTC) From: Evgeny Novikov To: Todor Tomov Cc: Evgeny Novikov , Andy Gross , Bjorn Andersson , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, ldv-project@linuxtesting.org, Anton Vasilyev Subject: [PATCH] media: camss: fix memory leaks on error handling paths in probe Date: Thu, 23 Jul 2020 20:46:51 +0300 Message-Id: <20200723174651.10392-1-novikov@ispras.ru> X-Mailer: git-send-email 2.16.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org camss_probe() does not free camss on error handling paths. The patch introduces an additional error label for this purpose. Besides, it removes call of v4l2_async_notifier_cleanup() from camss_of_parse_ports() since its caller, camss_probe(), cleans up all its resources itself. Found by Linux Driver Verification project (linuxtesting.org). Co-Developed-by: Anton Vasilyev Signed-off-by: Evgeny Novikov Signed-off-by: Anton Vasilyev --- drivers/media/platform/qcom/camss/camss.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c index 3fdc9f964a3c..2483641799df 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -504,7 +504,6 @@ static int camss_of_parse_ports(struct camss *camss) return num_subdevs; err_cleanup: - v4l2_async_notifier_cleanup(&camss->notifier); of_node_put(node); return ret; } @@ -835,29 +834,38 @@ static int camss_probe(struct platform_device *pdev) camss->csid_num = 4; camss->vfe_num = 2; } else { - return -EINVAL; + ret = -EINVAL; + goto err_free; } camss->csiphy = devm_kcalloc(dev, camss->csiphy_num, sizeof(*camss->csiphy), GFP_KERNEL); - if (!camss->csiphy) - return -ENOMEM; + if (!camss->csiphy) { + ret = -ENOMEM; + goto err_free; + } camss->csid = devm_kcalloc(dev, camss->csid_num, sizeof(*camss->csid), GFP_KERNEL); - if (!camss->csid) - return -ENOMEM; + if (!camss->csid) { + ret = -ENOMEM; + goto err_free; + } camss->vfe = devm_kcalloc(dev, camss->vfe_num, sizeof(*camss->vfe), GFP_KERNEL); - if (!camss->vfe) - return -ENOMEM; + if (!camss->vfe) { + ret = -ENOMEM; + goto err_free; + } v4l2_async_notifier_init(&camss->notifier); num_subdevs = camss_of_parse_ports(camss); - if (num_subdevs < 0) - return num_subdevs; + if (num_subdevs < 0) { + ret = num_subdevs; + goto err_cleanup; + } ret = camss_init_subdevices(camss); if (ret < 0) @@ -936,6 +944,8 @@ static int camss_probe(struct platform_device *pdev) v4l2_device_unregister(&camss->v4l2_dev); err_cleanup: v4l2_async_notifier_cleanup(&camss->notifier); +err_free: + kfree(camss); return ret; } -- 2.16.4