Skip to content

Commit 415798b

Browse files
Ansuellag-linaro
authored andcommitted
leds: trigger: netdev: Fix kernel panic on interface rename trig notify
Commit d5e0126 ("leds: trigger: netdev: add additional specific link speed mode") in the various changes, reworked the way to set the LINKUP mode in commit cee4bd1 ("leds: trigger: netdev: Recheck NETDEV_LED_MODE_LINKUP on dev rename") and moved it to a generic function. This changed the logic where, in the previous implementation the dev from the trigger event was used to check if the carrier was ok, but in the new implementation with the generic function, the dev in trigger_data is used instead. This is problematic and cause a possible kernel panic due to the fact that the dev in the trigger_data still reference the old one as the new one (passed from the trigger event) still has to be hold and saved in the trigger_data struct (done in the NETDEV_REGISTER case). On calling of get_device_state(), an invalid net_dev is used and this cause a kernel panic. To handle this correctly, move the call to get_device_state() after the new net_dev is correctly set in trigger_data (in the NETDEV_REGISTER case) and correctly parse the new dev. Fixes: d5e0126 ("leds: trigger: netdev: add additional specific link speed mode") Cc: [email protected] Signed-off-by: Christian Marangi <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent 1c5b72e commit 415798b

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

drivers/leds/trigger/ledtrig-netdev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,12 @@ static int netdev_trig_notify(struct notifier_block *nb,
581581
trigger_data->duplex = DUPLEX_UNKNOWN;
582582
switch (evt) {
583583
case NETDEV_CHANGENAME:
584-
get_device_state(trigger_data);
585-
fallthrough;
586584
case NETDEV_REGISTER:
587585
dev_put(trigger_data->net_dev);
588586
dev_hold(dev);
589587
trigger_data->net_dev = dev;
588+
if (evt == NETDEV_CHANGENAME)
589+
get_device_state(trigger_data);
590590
break;
591591
case NETDEV_UNREGISTER:
592592
dev_put(trigger_data->net_dev);

0 commit comments

Comments
 (0)