From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bjorn Helgaas Date: Thu, 18 Jan 2018 14:42:24 +0000 Subject: Re: [PATCH -next] PCI: dra7xx: Fix potential NULL dereference Message-Id: <20180118144224.GF53542@bhelgaas-glaptop.roam.corp.google.com> List-Id: References: <1516284037-81537-1-git-send-email-weiyongjun1@huawei.com> In-Reply-To: <1516284037-81537-1-git-send-email-weiyongjun1@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Wei Yongjun Cc: Kishon Vijay Abraham I , Lorenzo Pieralisi , Bjorn Helgaas , linux-omap@vger.kernel.org, linux-pci@vger.kernel.org, kernel-janitors@vger.kernel.org On Thu, Jan 18, 2018 at 02:00:37PM +0000, Wei Yongjun wrote: > platform_get_resource_byname() may fail and return NULL, so we should > better check it's return value to avoid a NULL pointer dereference a > bit later in the code. > > This is detected by Coccinelle semantic patch. > > @@ > expression pdev, res, n, t, e, e1, e2; > @@ > > res = platform_get_resource_byname(pdev, t, n); > + if (!res) > + return -EINVAL; > ... when != res = NULL > e = devm_ioremap(e1, res->start, e2); This pattern of: platform_get_resource_byname devm_ioremap is extremely common and could perhaps be factored out. There are already a few private versions, e.g., request_and_map(), msm_ioremap(), ssi_get_iomem(). request_and_map() also includes devm_request_mem_region(), which probably *should* be included but usually seems to be omitted. > Fixes: 608793e27b33 ("PCI: dwc: dra7xx: Add EP mode support") > Signed-off-by: Wei Yongjun > --- > drivers/pci/dwc/pci-dra7xx.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c > index 8bf7c27..aafded8 100644 > --- a/drivers/pci/dwc/pci-dra7xx.c > +++ b/drivers/pci/dwc/pci-dra7xx.c > @@ -409,11 +409,15 @@ static int __init dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx, > ep->ops = &pcie_ep_ops; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ep_dbics"); > + if (!res) > + return -EINVAL; > pci->dbi_base = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base) > return -ENOMEM; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ep_dbics2"); > + if (!res) > + return -EINVAL; > pci->dbi_base2 = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base2) > return -ENOMEM; > @@ -462,6 +466,8 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx, > return ret; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rc_dbics"); > + if (!res) > + return -EINVAL; > pci->dbi_base = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base) > return -ENOMEM; > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org ([198.145.29.99]:35002 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756417AbeAROm0 (ORCPT ); Thu, 18 Jan 2018 09:42:26 -0500 Date: Thu, 18 Jan 2018 08:42:24 -0600 From: Bjorn Helgaas To: Wei Yongjun Cc: Kishon Vijay Abraham I , Lorenzo Pieralisi , Bjorn Helgaas , linux-omap@vger.kernel.org, linux-pci@vger.kernel.org, kernel-janitors@vger.kernel.org Subject: Re: [PATCH -next] PCI: dra7xx: Fix potential NULL dereference Message-ID: <20180118144224.GF53542@bhelgaas-glaptop.roam.corp.google.com> References: <1516284037-81537-1-git-send-email-weiyongjun1@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <1516284037-81537-1-git-send-email-weiyongjun1@huawei.com> Sender: linux-pci-owner@vger.kernel.org List-ID: On Thu, Jan 18, 2018 at 02:00:37PM +0000, Wei Yongjun wrote: > platform_get_resource_byname() may fail and return NULL, so we should > better check it's return value to avoid a NULL pointer dereference a > bit later in the code. > > This is detected by Coccinelle semantic patch. > > @@ > expression pdev, res, n, t, e, e1, e2; > @@ > > res = platform_get_resource_byname(pdev, t, n); > + if (!res) > + return -EINVAL; > ... when != res == NULL > e = devm_ioremap(e1, res->start, e2); This pattern of: platform_get_resource_byname devm_ioremap is extremely common and could perhaps be factored out. There are already a few private versions, e.g., request_and_map(), msm_ioremap(), ssi_get_iomem(). request_and_map() also includes devm_request_mem_region(), which probably *should* be included but usually seems to be omitted. > Fixes: 608793e27b33 ("PCI: dwc: dra7xx: Add EP mode support") > Signed-off-by: Wei Yongjun > --- > drivers/pci/dwc/pci-dra7xx.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c > index 8bf7c27..aafded8 100644 > --- a/drivers/pci/dwc/pci-dra7xx.c > +++ b/drivers/pci/dwc/pci-dra7xx.c > @@ -409,11 +409,15 @@ static int __init dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx, > ep->ops = &pcie_ep_ops; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ep_dbics"); > + if (!res) > + return -EINVAL; > pci->dbi_base = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base) > return -ENOMEM; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ep_dbics2"); > + if (!res) > + return -EINVAL; > pci->dbi_base2 = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base2) > return -ENOMEM; > @@ -462,6 +466,8 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx, > return ret; > > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rc_dbics"); > + if (!res) > + return -EINVAL; > pci->dbi_base = devm_ioremap(dev, res->start, resource_size(res)); > if (!pci->dbi_base) > return -ENOMEM; >