Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: amd8111: Fix PCI device reference count leak

for_each_pci_dev() is implemented by pci_get_device(). The comment of
pci_get_device() says that it will increase the reference count for the
returned pci_dev and also decrease the reference count for the input
pci_dev @from if it is not NULL.

If we break for_each_pci_dev() loop with pdev not NULL, we need to call
pci_dev_put() to decrease the reference count. Add the missing
pci_dev_put() after the 'out' label. Since pci_dev_put() can handle NULL
input parameter, there is no problem for the 'Device not found' branch.
For the normal path, add pci_dev_put() in amd_gpio_exit().

Fixes: f942a7de047d ("gpio: add a driver for GPIO pins found on AMD-8111 south bridge chips")
Signed-off-by: Xiongfeng Wang <wangxiongfeng2@huawei.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

authored by

Xiongfeng Wang and committed by
Bartosz Golaszewski
45fecdb9 ec851b23

+4
+4
drivers/gpio/gpio-amd8111.c
··· 226 226 ioport_unmap(gp.pm); 227 227 goto out; 228 228 } 229 + return 0; 230 + 229 231 out: 232 + pci_dev_put(pdev); 230 233 return err; 231 234 } 232 235 ··· 237 234 { 238 235 gpiochip_remove(&gp.chip); 239 236 ioport_unmap(gp.pm); 237 + pci_dev_put(gp.pdev); 240 238 } 241 239 242 240 module_init(amd_gpio_init);