Commit dae68d7f authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

PCI: hotplug: ACPI: Fix context refcounting in acpiphp_grab_context()

If context is not NULL in acpiphp_grab_context(), but the
is_going_away flag is set for the device's parent, the reference
counter of the context needs to be decremented before returning
NULL or the context will never be freed, so make that happen.

Fixes: edf5bf34 ("ACPI / dock: Use callback pointers from devices' ACPI hotplug contexts")
Reported-by: default avatarVasily Averin <vvs@virtuozzo.com>
Cc: 3.15+ <stable@vger.kernel.org> # 3.15+
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 48778464
...@@ -122,13 +122,21 @@ static struct acpiphp_context *acpiphp_grab_context(struct acpi_device *adev) ...@@ -122,13 +122,21 @@ static struct acpiphp_context *acpiphp_grab_context(struct acpi_device *adev)
struct acpiphp_context *context; struct acpiphp_context *context;
acpi_lock_hp_context(); acpi_lock_hp_context();
context = acpiphp_get_context(adev); context = acpiphp_get_context(adev);
if (!context || context->func.parent->is_going_away) { if (!context)
acpi_unlock_hp_context(); goto unlock;
return NULL;
if (context->func.parent->is_going_away) {
acpiphp_put_context(context);
context = NULL;
goto unlock;
} }
get_bridge(context->func.parent); get_bridge(context->func.parent);
acpiphp_put_context(context); acpiphp_put_context(context);
unlock:
acpi_unlock_hp_context(); acpi_unlock_hp_context();
return context; return context;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment