PCI/IOV: Fix memory leak in pci_iov_add_virtfn()
authorNavid Emamdoost <navid.emamdoost@gmail.com>
Mon, 25 Nov 2019 19:52:52 +0000 (13:52 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2020 21:34:08 +0000 (16:34 -0500)
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

index b3f972e..deec9f9 100644 (file)
@@ -187,10 +187,10 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
        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 *dev, int id)
 
        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);