ACPI / scan: Fix NULL pointer dereference in acpi_companion_match()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 13 Apr 2015 19:35:51 +0000 (21:35 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 13 Apr 2015 19:35:51 +0000 (21:35 +0200)
Commit e1acdeb0e770 "ACPI / scan: Simplify acpi_match_device()"
introduced code that may lead to a NULL pointer dereference when
trying to unlock a mutex.  Fix that.

Fixes: e1acdeb0e770 "ACPI / scan: Simplify acpi_match_device()"
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/scan.c

index d2e3c3e3f9c98eed36074a1a77721adb2eb72a30..69bc0d888c012523d03f15267c3ca75a1d4a10e3 100644 (file)
@@ -247,6 +247,7 @@ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias,
 static struct acpi_device *acpi_companion_match(const struct device *dev)
 {
        struct acpi_device *adev;
+       struct mutex *physical_node_lock;
 
        adev = ACPI_COMPANION(dev);
        if (!adev)
@@ -255,7 +256,8 @@ static struct acpi_device *acpi_companion_match(const struct device *dev)
        if (list_empty(&adev->pnp.ids))
                return NULL;
 
-       mutex_lock(&adev->physical_node_lock);
+       physical_node_lock = &adev->physical_node_lock;
+       mutex_lock(physical_node_lock);
        if (list_empty(&adev->physical_node_list)) {
                adev = NULL;
        } else {
@@ -266,7 +268,7 @@ static struct acpi_device *acpi_companion_match(const struct device *dev)
                if (node->dev != dev)
                        adev = NULL;
        }
-       mutex_unlock(&adev->physical_node_lock);
+       mutex_unlock(physical_node_lock);
 
        return adev;
 }