acpi: thermal: Fix error handling in the register function
authorAndrzej Pietrasiewicz <andrzej.p@collabora.com>
Mon, 29 Jun 2020 12:29:15 +0000 (14:29 +0200)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 29 Jun 2020 18:26:32 +0000 (20:26 +0200)
The acpi_thermal_register_thermal_zone() is missing any error handling.
This needs to be fixed.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20200629122925.21729-2-andrzej.p@collabora.com
drivers/acpi/thermal.c

index 19067a5e52934e6fb356448fe13457409176e58a..6de8066ca1e7f97836585ea60d2a07911aca0436 100644 (file)
@@ -901,23 +901,35 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
        result = sysfs_create_link(&tz->device->dev.kobj,
                                   &tz->thermal_zone->device.kobj, "thermal_zone");
        if (result)
-               return result;
+               goto unregister_tzd;
 
        result = sysfs_create_link(&tz->thermal_zone->device.kobj,
                                   &tz->device->dev.kobj, "device");
        if (result)
-               return result;
+               goto remove_tz_link;
 
        status =  acpi_bus_attach_private_data(tz->device->handle,
                                               tz->thermal_zone);
-       if (ACPI_FAILURE(status))
-               return -ENODEV;
+       if (ACPI_FAILURE(status)) {
+               result = -ENODEV;
+               goto remove_dev_link;
+       }
 
        tz->tz_enabled = 1;
 
        dev_info(&tz->device->dev, "registered as thermal_zone%d\n",
                 tz->thermal_zone->id);
+
        return 0;
+
+remove_dev_link:
+       sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
+remove_tz_link:
+       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+unregister_tzd:
+       thermal_zone_device_unregister(tz->thermal_zone);
+
+       return result;
 }
 
 static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)