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)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 9 Dec 2019 21:51:32 +0000 (15:51 -0600)
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>
drivers/pci/iov.c

index 1e88fd427757859d7db1cdae6c72d6580b20cc95..4d1f392b05f9affaeec269613935ef51dfc2d7e7 100644 (file)
@@ -186,10 +186,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);
 
@@ -197,11 +197,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);