PCI: Avoid potential NULL pointer dereference in pci_scan_bridge
authorJesper Juhl <jj@chaosbits.net>
Mon, 24 Jan 2011 20:14:33 +0000 (21:14 +0100)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Tue, 8 Feb 2011 21:08:05 +0000 (13:08 -0800)
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>
drivers/pci/probe.c

index c84900da3c59249e44466d7b1e601e4f399f3293..44cbbbaa499da6fc4ad886febdb5598af4993011 100644 (file)
@@ -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.
                 */