]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: pciehp: Prevent NULL dereference during probe
authorAndreas Noever <andreas.noever@gmail.com>
Tue, 16 Sep 2014 21:16:02 +0000 (15:16 -0600)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 14 Dec 2014 16:23:42 +0000 (16:23 +0000)
commit bceee4a97eb58bd0e80e39eff11b506ddd9e7ad3 upstream.

pciehp assumes that dev->subordinate, the struct pci_bus for a bridge's
secondary bus, exists.  But we do not create that bus if we run out of bus
numbers during enumeration.  This leads to a NULL dereference in
init_slot() (and other places).

Change pciehp_probe() to return -ENODEV when no secondary bus is present.

Signed-off-by: Andreas Noever <andreas.noever@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/pci/hotplug/pciehp_core.c

index 9350af9011a196cfd25901493f411c70e9ffc168..dc126a2326484312780586291f8d6d873cbce0e2 100644 (file)
@@ -237,6 +237,13 @@ static int pciehp_probe(struct pcie_device *dev)
        else if (pciehp_acpi_slot_detection_check(dev->port))
                goto err_out_none;
 
+       if (!dev->port->subordinate) {
+               /* Can happen if we run out of bus numbers during probe */
+               dev_err(&dev->device,
+                       "Hotplug bridge without secondary bus, ignoring\n");
+               goto err_out_none;
+       }
+
        ctrl = pcie_init(dev);
        if (!ctrl) {
                dev_err(&dev->device, "Controller initialization failed\n");