Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: trigger: Unregister sysfs attributes before calling deactivate()

Triggers which have trigger specific sysfs attributes typically store
related data in trigger-data allocated by the activate() callback and
freed by the deactivate() callback.

Calling device_remove_groups() after calling deactivate() leaves a window
where the sysfs attributes show/store functions could be called after
deactivation and then operate on the just freed trigger-data.

Move the device_remove_groups() call to before deactivate() to close
this race window.

This also makes the deactivation path properly do things in reverse order
of the activation path which calls the activate() callback before calling
device_add_groups().

Fixes: a7e7a3156300 ("leds: triggers: add device attribute support")
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20240504162533.76780-1-hdegoede@redhat.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Hans de Goede and committed by
Lee Jones
c0dc9adf 4a598907

+1 -1
+1 -1
drivers/leds/led-triggers.c
··· 179 179 180 180 cancel_work_sync(&led_cdev->set_brightness_work); 181 181 led_stop_software_blink(led_cdev); 182 + device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); 182 183 if (led_cdev->trigger->deactivate) 183 184 led_cdev->trigger->deactivate(led_cdev); 184 - device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); 185 185 led_cdev->trigger = NULL; 186 186 led_cdev->trigger_data = NULL; 187 187 led_cdev->activated = false;