ChangeSet 1.1787, 2004/07/02 13:33:23-07:00, linas@austin.ibm.com [PATCH] PCI Hotplug: rpaphp null pointer deref This patch fixes a null-pointer dereference when hot-plug operations are performed on a machine that has virtual-io devices in it. Virtual i/o devices to not have pci bridges associated with them. It also corrects an ordering problem during hotplug remove. This patch was previously reviewed/tested by Linda Xie, the current rpaphp maintainer. Signed-off-by: Linas Vepstas Signed-off-by: Greg Kroah-Hartman drivers/pci/hotplug/rpaphp_pci.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff -Nru a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c --- a/drivers/pci/hotplug/rpaphp_pci.c 2004-07-02 14:24:33 -07:00 +++ b/drivers/pci/hotplug/rpaphp_pci.c 2004-07-02 14:24:33 -07:00 @@ -378,8 +378,8 @@ func = list_entry(ln, struct rpaphp_pci_func, sibling); if (func->pci_dev) { - rpaphp_eeh_remove_bus_device(func->pci_dev); pci_remove_bus_device(func->pci_dev); + rpaphp_eeh_remove_bus_device(func->pci_dev); } kfree(func); } @@ -513,9 +513,18 @@ struct list_head *ln; slot = list_entry(tmp, struct slot, rpaphp_slot_list); + if (slot->bridge == NULL) { + if (slot->dev_type == PCI_DEV) { + printk(KERN_WARNING "PCI slot missing bridge %s %s \n", + slot->name, slot->location); + } + continue; + } + bus = slot->bridge->subordinate; - if (!bus) - return NULL; /* shouldn't be here */ + if (!bus) { + continue; /* should never happen? */ + } for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { struct pci_dev *pdev = pci_dev_b(ln); if (pdev == dev)