rfkill: Register LED triggers before registering switch
PATCH 1/1 rfkill: Register LED triggers before registering switch
Registering the switch triggers a LED event, so we must register LED triggers before the switch.
This has a potential to fix a crash, depending on how the device driver initializes the rfkill data structure.
Signed-off-by Michael Buesch <[email protected]>
net/rfkill/rfkill.c +6 -5
@@ -388,19 +388,20 @@ int rfkill_register(struct rfkill *rfkilif (!rfkill->toggle_radio)return -EINVAL ; +snprintf (dev->bus_id,sizeof (dev->bus_id), +"rfkill%ld" , (long )atomic_inc_return (&rfkill_no) -1 ); + +rfkill_led_trigger_register (rfkill); + error =rfkill_add_switch (rfkill);if (error)return error; -snprintf (dev->bus_id,sizeof (dev->bus_id), -"rfkill%ld" , (long )atomic_inc_return (&rfkill_no) -1 ); - error =device_add (dev);if (error) {rfkill_remove_switch (rfkill);return error; } -rfkill_led_trigger_register (rfkill);return 0 ; }
@@ -416,9 +417,9 @@ EXPORT_SYMBOL(rfkill_register);*/ void rfkill_unregister (struct rfkill *rfkill) { -rfkill_led_trigger_unregister (rfkill);device_del (&rfkill->dev);rfkill_remove_switch (rfkill); +rfkill_led_trigger_unregister (rfkill);put_device (&rfkill->dev); }EXPORT_SYMBOL (rfkill_unregister);
Quoted 6 lines · Michael Buesch
Registering the switch triggers a LED event, so we must register LED triggers before the switch.
This has a potential to fix a crash, depending on how the device driver initializes the rfkill data structure.Signed-off-by Michael Buesch <[email protected]>
Signed-off-by Ivo van Doorn <[email protected]>
Quoted 42 lines
Index:
wireless-2.6/net/rfkill/rfkill.c
===================================================================net/rfkill/rfkill.c +6
-5@@ -388,19 +388,20 @@ int rfkill_register(struct rfkill *rfkilif (!rfkill->toggle_radio)return -EINVAL ; +snprintf (dev->bus_id,sizeof (dev->bus_id), +"rfkill%ld" , (long )atomic_inc_return (&rfkill_no) -1 ); + +rfkill_led_trigger_register (rfkill); + error =rfkill_add_switch (rfkill);if (error)return error; -snprintf (dev->bus_id,sizeof (dev->bus_id), -"rfkill%ld" , (long )atomic_inc_return (&rfkill_no) -1 ); - error =device_add (dev);if (error) {rfkill_remove_switch (rfkill);return error; } -rfkill_led_trigger_register (rfkill);return 0 ; }@@ -416,9 +417,9 @@ EXPORT_SYMBOL(rfkill_register);*/ void rfkill_unregister (struct rfkill *rfkill) { -rfkill_led_trigger_unregister (rfkill);device_del (&rfkill->dev);rfkill_remove_switch (rfkill); +rfkill_led_trigger_unregister (rfkill);put_device (&rfkill->dev); }EXPORT_SYMBOL (rfkill_unregister);