diff options
author | Jesper Juhl <jj@chaosbits.net> | 2011-01-24 21:14:33 +0100 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2011-02-08 13:08:05 -0800 |
commit | 7c867c8899e873652ef98a890d2e647c092bec25 (patch) | |
tree | 482e3c673dd58243be6ed73915fd0c92dc44ca9a /drivers/pci | |
parent | c13ff2ff3ad1479f222e18f9caba3db5af68d549 (diff) | |
download | linux-3.10-7c867c8899e873652ef98a890d2e647c092bec25.tar.gz linux-3.10-7c867c8899e873652ef98a890d2e647c092bec25.tar.bz2 linux-3.10-7c867c8899e873652ef98a890d2e647c092bec25.zip |
PCI: Avoid potential NULL pointer dereference in pci_scan_bridge
pci_add_new_bus() calls pci_alloc_child_bus() which calls pci_alloc_bus()
that allocates memory dynamically with kzalloc(). The return value of
kzalloc() is the pointer that's eventually returned from
pci_add_new_bus(), so since kzalloc() can fail and return NULL so can
pci_add_new_bus(). Thus we may end up dereferencing a NULL pointer in
drivers/pci/probe.c::pci_scan_bridge(). Seems to me we should test for
this and bail out if it happens rather than crashing.
Also removed some trailing whitespace that bugged me while looking at
this.
Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index c84900da3c5..44cbbbaa499 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -764,6 +764,8 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, if (pci_find_bus(pci_domain_nr(bus), max+1)) goto out; child = pci_add_new_bus(bus, dev, ++max); + if (!child) + goto out; buses = (buses & 0xff000000) | ((unsigned int)(child->primary) << 0) | ((unsigned int)(child->secondary) << 8) @@ -777,7 +779,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, buses &= ~0xff000000; buses |= CARDBUS_LATENCY_TIMER << 24; } - + /* * We need to blast all three values with a single write. */ |