Commit 8c386cc8 authored by Navid Emamdoost's avatar Navid Emamdoost Committed by Bjorn Helgaas
Browse files

PCI/IOV: Fix memory leak in pci_iov_add_virtfn()

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: 156c5532 ("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: default avatarNavid Emamdoost <navid.emamdoost@gmail.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent e42617b8
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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);