Messages in this thread | | | Date | Mon, 1 Aug 2022 20:26:07 +0200 | Subject | Re: [PATCH] mtd: rawnand: denali: Fix a possible resource leak in denali_pci_probe | From | Christophe JAILLET <> |
| |
Le 01/08/2022 à 10:03, GONG, Ruiqi a écrit : > Call pci_release_regions() to retrieve the allocated resource when > devm_ioremap() or denali_init() failed. >
Hi, this is not correct.
First, should you be right, you should also update the .remove() function the same way.
Second, at the beginning there is pcim_enable_device() call. This looked like magic to me when I first saw it, but this function makes some pci_ functions work just as it they were pcim_ functions.
See pcim_enable_device() ([1]), at line 2132. When pcim_release() ([2]) is called by the framework, then regions are released at line 2079
CJ
[1]: https://elixir.bootlin.com/linux/v5.19/source/drivers/pci/pci.c#L2118 [2]: https://elixir.bootlin.com/linux/v5.19/source/drivers/pci/pci.c#L2071
> Signed-off-by: GONG, Ruiqi <gongruiqi1@huawei.com> > --- > drivers/mtd/nand/raw/denali_pci.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/mtd/nand/raw/denali_pci.c b/drivers/mtd/nand/raw/denali_pci.c > index de7e722d3826..40943cda0914 100644 > --- a/drivers/mtd/nand/raw/denali_pci.c > +++ b/drivers/mtd/nand/raw/denali_pci.c > @@ -74,21 +74,22 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > return ret; > } > > + ret = -ENOMEM; > denali->reg = devm_ioremap(denali->dev, csr_base, csr_len); > if (!denali->reg) { > dev_err(&dev->dev, "Spectra: Unable to remap memory region\n"); > - return -ENOMEM; > + goto out_release_pci; > } > > denali->host = devm_ioremap(denali->dev, mem_base, mem_len); > if (!denali->host) { > dev_err(&dev->dev, "Spectra: ioremap failed!"); > - return -ENOMEM; > + goto out_release_pci; > } > > ret = denali_init(denali); > if (ret) > - return ret; > + goto out_release_pci; > > nsels = denali->nbanks; > > @@ -116,6 +117,8 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > > out_remove_denali: > denali_remove(denali); > +out_release_pci: > + pci_release_regions(dev); > return ret; > } >
| |