]> git.baikalelectronics.ru Git - kernel.git/commit
ACPI / hotplug / PCI: Fix NULL pointer dereference in cleanup_bridge()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 17 Aug 2013 20:16:33 +0000 (22:16 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 17 Aug 2013 20:16:33 +0000 (22:16 +0200)
commitf486a2ac73e6ea2fd234d524166eb5cd1124bb95
tree86340f467111ac68148ba3f32ae88213bbfd8cae
parent7c95cf87b4e2e82e289075a21ad154125df70bb4
ACPI / hotplug / PCI: Fix NULL pointer dereference in cleanup_bridge()

After commit 4188585 (ACPI / hotplug / PCI: Register all devices
under the given bridge) register_slot() is called for all PCI
devices under a given bridge that have corresponding objects in
the ACPI namespace, but it calls acpiphp_register_hotplug_slot()
only for devices satisfying specific criteria.  Still,
cleanup_bridge() calls acpiphp_unregister_hotplug_slot() for all
objects created by register_slot(), although it should only call it
for the ones that acpiphp_register_hotplug_slot() has been called
for (successfully).  This causes a NULL pointer to be dereferenced
by the acpiphp_unregister_hotplug_slot() executed by cleanup_bridge()
if the object it is called for has not been passed to
acpiphp_register_hotplug_slot().

To fix this problem, check if the 'slot' field of the object passed
to acpiphp_unregister_hotplug_slot() in cleanup_bridge() is not NULL,
which only is the case if acpiphp_register_hotplug_slot() has been
executed for that object.  In addition to that, make register_slot()
reset the 'slot' field to NULL if acpiphp_register_hotplug_slot() has
failed for the given object to prevent stale pointers from being
used by acpiphp_unregister_hotplug_slot().

Reported-and-tested-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/pci/hotplug/acpiphp_glue.c