[PATCH v2 2/4] leds: trigger: netdev: Access net_dev under trigger_data->lock in the worker

From: A. Sverdlin

Date: Mon Sep 21 2026 - 05:43:19 EST


From: Alexander Sverdlin <alexander.sverdlin@xxxxxxxxxxx>

netdev_trig_work() dereferences trigger_data->net_dev without the lock,
while set_device_name() and netdev_trig_notify() dev_put() and replace it
under trigger_data->lock. On NETDEV_UNREGISTER the worker can run
dev_get_stats() on a netdev being freed (UAF).

Take trigger_data->lock in the worker. cancel_delayed_work_sync() must
then never run under that lock.

Cc: stable@xxxxxxxxxxxxxxx
Closes: https://lore.kernel.org/all/20260914142116.6DAC51F000FF@xxxxxxxxxxxxxxx/
Fixes: 06f502f57d0d ("leds: trigger: Introduce a NETDEV trigger")
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@xxxxxxxxxxx>
---
Changelog:
v2:
- new patch

drivers/leds/trigger/ledtrig-netdev.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c
index c65df91c4f6dc..8b807451b642d 100644
--- a/drivers/leds/trigger/ledtrig-netdev.c
+++ b/drivers/leds/trigger/ledtrig-netdev.c
@@ -679,6 +679,8 @@ static void netdev_trig_work(struct work_struct *work)
unsigned long interval;
int invert;

+ guard(mutex)(&trigger_data->lock);
+
/* If we dont have a device, insure we are off */
if (!trigger_data->net_dev) {
led_set_brightness(trigger_data->led_cdev, LED_OFF);
--
2.55.0