Skip to content

Commit 804443c

Browse files
Ma Kebjorn-helgaas
authored andcommitted
PCI: Fix reference leak in pci_register_host_bridge()
If device_register() fails, call put_device() to give up the reference to avoid a memory leak, per the comment at device_register(). Found by code review. Link: https://lore.kernel.org/r/[email protected] Fixes: 37d6a0a ("PCI: Add pci_register_host_bridge() interface") Signed-off-by: Ma Ke <[email protected]> [bhelgaas: squash Dan Carpenter's double free fix from https://lore.kernel.org/r/[email protected]] Signed-off-by: Bjorn Helgaas <[email protected]> Cc: [email protected]
1 parent a7eb912 commit 804443c

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/pci/probe.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,7 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
953953
resource_size_t offset, next_offset;
954954
LIST_HEAD(resources);
955955
struct resource *res, *next_res;
956+
bool bus_registered = false;
956957
char addr[64], *fmt;
957958
const char *name;
958959
int err;
@@ -1017,6 +1018,7 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
10171018
name = dev_name(&bus->dev);
10181019

10191020
err = device_register(&bus->dev);
1021+
bus_registered = true;
10201022
if (err)
10211023
goto unregister;
10221024

@@ -1103,12 +1105,15 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
11031105
unregister:
11041106
put_device(&bridge->dev);
11051107
device_del(&bridge->dev);
1106-
11071108
free:
11081109
#ifdef CONFIG_PCI_DOMAINS_GENERIC
11091110
pci_bus_release_domain_nr(parent, bus->domain_nr);
11101111
#endif
1111-
kfree(bus);
1112+
if (bus_registered)
1113+
put_device(&bus->dev);
1114+
else
1115+
kfree(bus);
1116+
11121117
return err;
11131118
}
11141119

0 commit comments

Comments
 (0)