| From 8c386cc817878588195dde38e919aa6ba9409d58 Mon Sep 17 00:00:00 2001 |
| From: Navid Emamdoost <navid.emamdoost@gmail.com> |
| Date: Mon, 25 Nov 2019 13:52:52 -0600 |
| Subject: PCI/IOV: Fix memory leak in pci_iov_add_virtfn() |
| |
| From: Navid Emamdoost <navid.emamdoost@gmail.com> |
| |
| commit 8c386cc817878588195dde38e919aa6ba9409d58 upstream. |
| |
| In the implementation of pci_iov_add_virtfn() the allocated virtfn is |
| leaked if pci_setup_device() fails. The error handling is not calling |
| pci_stop_and_remove_bus_device(). Change the goto label to failed2. |
| |
| Fixes: 156c55325d30 ("PCI: Check for pci_setup_device() failure in pci_iov_add_virtfn()") |
| Link: https://lore.kernel.org/r/20191125195255.23740-1-navid.emamdoost@gmail.com |
| Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pci/iov.c | 9 ++++----- |
| 1 file changed, 4 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/pci/iov.c |
| +++ b/drivers/pci/iov.c |
| @@ -187,10 +187,10 @@ int pci_iov_add_virtfn(struct pci_dev *d |
| sprintf(buf, "virtfn%u", id); |
| rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf); |
| if (rc) |
| - goto failed2; |
| + goto failed1; |
| rc = sysfs_create_link(&virtfn->dev.kobj, &dev->dev.kobj, "physfn"); |
| if (rc) |
| - goto failed3; |
| + goto failed2; |
| |
| kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE); |
| |
| @@ -198,11 +198,10 @@ int pci_iov_add_virtfn(struct pci_dev *d |
| |
| return 0; |
| |
| -failed3: |
| - sysfs_remove_link(&dev->dev.kobj, buf); |
| failed2: |
| - pci_stop_and_remove_bus_device(virtfn); |
| + sysfs_remove_link(&dev->dev.kobj, buf); |
| failed1: |
| + pci_stop_and_remove_bus_device(virtfn); |
| pci_dev_put(dev); |
| failed0: |
| virtfn_remove_bus(dev->bus, bus); |