]> git.karo-electronics.de Git - karo-tx-linux.git/commit
ACPI / PCI: Fix NULL pointer dereference in acpi_get_pci_dev() (rev. 2)
authorRafael J. Wysocki <rjw@sisk.pl>
Mon, 12 Oct 2009 23:01:57 +0000 (01:01 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Nov 2009 00:22:48 +0000 (16:22 -0800)
commit5621e89d8bdf6934b3c0a4893e1a568f4a01061d
tree8628fa2160ed34bd08d10f1a1c0de4614dd46d80
parente259007f0090e5c2c4c0df1e316431a25287633e
ACPI / PCI: Fix NULL pointer dereference in acpi_get_pci_dev() (rev. 2)

commit 497fb54f578efd2b479727bc88d5ef942c0a1e2d upstream.

acpi_get_pci_dev() may be called for a non-PCI device, in which case
it should return NULL.  However, it assumes that every handle it
finds in the ACPI CA name space, between given device handle and the
PCI root bridge handle, corresponds to a PCI-to-PCI bridge with an
existing secondary bus.  For this reason, when it finds a struct
pci_dev object corresponding to one of them, it doesn't check if
its 'subordinate' field is a valid pointer.  This obviously leads to
a NULL pointer dereference if acpi_get_pci_dev() is called for a
non-PCI device with a PCI parent which is not a bridge.

To fix this issue make acpi_get_pci_dev() check if pdev->subordinate
is not NULL for every device it finds on the path between the root
bridge and the device it's supposed to get to and return NULL if the
"target" device cannot be found.

http://bugzilla.kernel.org/show_bug.cgi?id=14129
(worked in 2.6.30, regression in 2.6.31)

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Reported-by: Danny Feng <dfeng@redhat.com>
Reviewed-by: Alex Chiang <achiang@hp.com>
Tested-by: chepioq <chepioq@gmail.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/acpi/pci_root.c