| From 5307f6d5fb12fd01f9f321bc4a8fd77e74858647 Mon Sep 17 00:00:00 2001 |
| From: Shyam Iyer <shyam.iyer.t@gmail.com> |
| Date: Thu, 8 Sep 2011 16:41:17 -0500 |
| Subject: Fix pointer dereference before call to pcie_bus_configure_settings |
| |
| From: Shyam Iyer <shyam.iyer.t@gmail.com> |
| |
| commit 5307f6d5fb12fd01f9f321bc4a8fd77e74858647 upstream. |
| |
| Commit b03e7495a862 ("PCI: Set PCI-E Max Payload Size on fabric") |
| introduced a potential NULL pointer dereference in calls to |
| pcie_bus_configure_settings due to attempts to access pci_bus self |
| variables when the self pointer is NULL. |
| |
| To correct this, verify that the self pointer in pci_bus is non-NULL |
| before dereferencing it. |
| |
| Reported-by: Stanislaw Gruszka <sgruszka@redhat.com> |
| Signed-off-by: Shyam Iyer <shyam_iyer@dell.com> |
| Signed-off-by: Jon Mason <mason@myri.com> |
| Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/pci/acpi.c | 9 +++++++-- |
| drivers/pci/hotplug/pcihp_slot.c | 4 +++- |
| drivers/pci/probe.c | 3 --- |
| 3 files changed, 10 insertions(+), 6 deletions(-) |
| |
| --- a/arch/x86/pci/acpi.c |
| +++ b/arch/x86/pci/acpi.c |
| @@ -366,8 +366,13 @@ struct pci_bus * __devinit pci_acpi_scan |
| */ |
| if (bus) { |
| struct pci_bus *child; |
| - list_for_each_entry(child, &bus->children, node) |
| - pcie_bus_configure_settings(child, child->self->pcie_mpss); |
| + list_for_each_entry(child, &bus->children, node) { |
| + struct pci_dev *self = child->self; |
| + if (!self) |
| + continue; |
| + |
| + pcie_bus_configure_settings(child, self->pcie_mpss); |
| + } |
| } |
| |
| if (!bus) |
| --- a/drivers/pci/hotplug/pcihp_slot.c |
| +++ b/drivers/pci/hotplug/pcihp_slot.c |
| @@ -169,7 +169,9 @@ void pci_configure_slot(struct pci_dev * |
| (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) |
| return; |
| |
| - pcie_bus_configure_settings(dev->bus, dev->bus->self->pcie_mpss); |
| + if (dev->bus && dev->bus->self) |
| + pcie_bus_configure_settings(dev->bus, |
| + dev->bus->self->pcie_mpss); |
| |
| memset(&hpp, 0, sizeof(hpp)); |
| ret = pci_get_hp_params(dev, &hpp); |
| --- a/drivers/pci/probe.c |
| +++ b/drivers/pci/probe.c |
| @@ -1461,9 +1461,6 @@ void pcie_bus_configure_settings(struct |
| { |
| u8 smpss = mpss; |
| |
| - if (!bus->self) |
| - return; |
| - |
| if (!pci_is_pcie(bus->self)) |
| return; |
| |