[PATCH 2/2] leds: cobalt-raq: Use devm_led_classdev_register() to fix use-after-unmap
Arunachalam <[email protected]> Sat, 25 Jul 2026 23:22:36 +0530
| Newsgroups | org.kernel.vger.linux-leds,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The driver had no .remove callback, but registered its LEDs with the unmanaged led_classdev_register() while the I/O mapping for led_port was already managed via devres. If the driver was unbound, devres would unmap led_port, but the LED classdevs would remain registered with no matching teardown. A subsequent sysfs brightness write would then dereference the now-unmapped led_port pointer. Switch to devm_led_classdev_register() so LED registration and the I/O mapping share the same devres lifetime and are torn down in the correct order automatically. Signed-off-by: Arunachalam <[email protected]> --- drivers/leds/leds-cobalt-raq.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/leds/leds-cobalt-raq.c b/drivers/leds/leds-cobalt-raq.c index 5b5acaa8c..ecb64ca9d 100644 --- a/drivers/leds/leds-cobalt-raq.c +++ b/drivers/leds/leds-cobalt-raq.c @@ -76,19 +76,16 @@ static int cobalt_raq_led_probe(struct platform_device *pdev) if (!led_port) return -ENOMEM; - retval = led_classdev_register(&pdev->dev, &raq_power_off_led); + retval = devm_led_classdev_register(&pdev->dev, &raq_power_off_led); if (retval) goto err_null; - retval = led_classdev_register(&pdev->dev, &raq_web_led); + retval = devm_led_classdev_register(&pdev->dev, &raq_web_led); if (retval) - goto err_unregister; + goto err_null; return 0; -err_unregister: - led_classdev_unregister(&raq_power_off_led); - err_null: led_port = NULL; -- 2.39.5