thermal/core: Delete device under thermal device zone lock
authorGuenter Roeck <linux@roeck-us.net>
Thu, 10 Nov 2022 15:24:53 +0000 (07:24 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 14 Nov 2022 18:04:37 +0000 (19:04 +0100)
Thermal device attributes may still be opened after unregistering
the thermal zone and deleting the thermal device.

Currently there is no protection against accessing thermal device
operations after unregistering a thermal zone. To enable adding
such protection, protect the device delete operation with the
thermal zone device mutex. This requires splitting the call to
device_unregister() into its components, device_del() and put_device().
Only the first call can be executed under mutex protection, since
put_device() may result in releasing the thermal zone device memory.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/thermal/thermal_core.c

index b31d3247667258a7b624c9836fb0d9fcce405131..5d19dc6a82b4d342cc0bb075290f893c6fc54bf3 100644 (file)
@@ -1391,7 +1391,12 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
        thermal_remove_hwmon_sysfs(tz);
        ida_free(&thermal_tz_ida, tz->id);
        ida_destroy(&tz->ida);
-       device_unregister(&tz->device);
+
+       mutex_lock(&tz->lock);
+       device_del(&tz->device);
+       mutex_unlock(&tz->lock);
+
+       put_device(&tz->device);
 
        thermal_notify_tz_delete(tz_id);
 }