]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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:33:23 +0000 (16:33 -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 c5f3cd4ed766f8d79798e8e22a8e12f56764333f..c3b0b10f95cb6bdf97f218af93d3162df51f52e2 100644 (file)
@@ -188,10 +188,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);
 
@@ -199,11 +199,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);