iwlwifi: Don't use buffer allocated on the stack for led names

Having the buffer on the stack and even re-using it for all led devices is bad.
Not being able to resolve the name member of the led device structure to a
meaningful value leads to confusion during ad-hoc debugging and potential
breakage in the future, if we ever decide to access the name member outside of
the registration function. Move the buffer to our private per led device
structures so that it is accessible after registration.

A quick grep didn't yield any occurence of using the led device name parameter
outside of the led device registration function, so currently we should already
be safe for normal operation.

Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
Cc: Richard Purdie <rpurdie@rpsys.net>
Acked-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by Sven Wegener and committed by John W. Linville 5cbbb376 4fc22b21

+36 -28
+17 -16
drivers/net/wireless/iwlwifi/iwl-3945-led.c
··· 206 206 static int iwl3945_led_register_led(struct iwl3945_priv *priv, 207 207 struct iwl3945_led *led, 208 208 enum led_type type, u8 set_led, 209 - const char *name, char *trigger) 209 + char *trigger) 210 210 { 211 211 struct device *device = wiphy_dev(priv->hw->wiphy); 212 212 int ret; 213 213 214 - led->led_dev.name = name; 214 + led->led_dev.name = led->name; 215 215 led->led_dev.brightness_set = iwl3945_led_brightness_set; 216 216 led->led_dev.default_trigger = trigger; 217 217 ··· 308 308 int iwl3945_led_register(struct iwl3945_priv *priv) 309 309 { 310 310 char *trigger; 311 - char name[32]; 312 311 int ret; 313 312 314 313 priv->last_blink_rate = 0; ··· 317 318 priv->allow_blinking = 0; 318 319 319 320 trigger = ieee80211_get_radio_led_name(priv->hw); 320 - snprintf(name, sizeof(name), "iwl-%s:radio", 321 + snprintf(priv->led[IWL_LED_TRG_RADIO].name, 322 + sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio", 321 323 wiphy_name(priv->hw->wiphy)); 322 324 323 325 priv->led[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on; ··· 327 327 328 328 ret = iwl3945_led_register_led(priv, 329 329 &priv->led[IWL_LED_TRG_RADIO], 330 - IWL_LED_TRG_RADIO, 1, 331 - name, trigger); 330 + IWL_LED_TRG_RADIO, 1, trigger); 331 + 332 332 if (ret) 333 333 goto exit_fail; 334 334 335 335 trigger = ieee80211_get_assoc_led_name(priv->hw); 336 - snprintf(name, sizeof(name), "iwl-%s:assoc", 336 + snprintf(priv->led[IWL_LED_TRG_ASSOC].name, 337 + sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc", 337 338 wiphy_name(priv->hw->wiphy)); 338 339 339 340 ret = iwl3945_led_register_led(priv, 340 341 &priv->led[IWL_LED_TRG_ASSOC], 341 - IWL_LED_TRG_ASSOC, 0, 342 - name, trigger); 342 + IWL_LED_TRG_ASSOC, 0, trigger); 343 + 343 344 /* for assoc always turn led on */ 344 345 priv->led[IWL_LED_TRG_ASSOC].led_on = iwl3945_led_on; 345 346 priv->led[IWL_LED_TRG_ASSOC].led_off = iwl3945_led_on; ··· 350 349 goto exit_fail; 351 350 352 351 trigger = ieee80211_get_rx_led_name(priv->hw); 353 - snprintf(name, sizeof(name), "iwl-%s:RX", 352 + snprintf(priv->led[IWL_LED_TRG_RX].name, 353 + sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX", 354 354 wiphy_name(priv->hw->wiphy)); 355 - 356 355 357 356 ret = iwl3945_led_register_led(priv, 358 357 &priv->led[IWL_LED_TRG_RX], 359 - IWL_LED_TRG_RX, 0, 360 - name, trigger); 358 + IWL_LED_TRG_RX, 0, trigger); 361 359 362 360 priv->led[IWL_LED_TRG_RX].led_on = iwl3945_led_associated; 363 361 priv->led[IWL_LED_TRG_RX].led_off = iwl3945_led_associated; ··· 366 366 goto exit_fail; 367 367 368 368 trigger = ieee80211_get_tx_led_name(priv->hw); 369 - snprintf(name, sizeof(name), "iwl-%s:TX", 369 + snprintf(priv->led[IWL_LED_TRG_TX].name, 370 + sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX", 370 371 wiphy_name(priv->hw->wiphy)); 371 372 372 373 ret = iwl3945_led_register_led(priv, 373 374 &priv->led[IWL_LED_TRG_TX], 374 - IWL_LED_TRG_TX, 0, 375 - name, trigger); 375 + IWL_LED_TRG_TX, 0, trigger); 376 + 376 377 priv->led[IWL_LED_TRG_TX].led_on = iwl3945_led_associated; 377 378 priv->led[IWL_LED_TRG_TX].led_off = iwl3945_led_associated; 378 379 priv->led[IWL_LED_TRG_TX].led_pattern = iwl3945_led_pattern;
+1
drivers/net/wireless/iwlwifi/iwl-3945-led.h
··· 50 50 struct iwl3945_led { 51 51 struct iwl3945_priv *priv; 52 52 struct led_classdev led_dev; 53 + char name[32]; 53 54 54 55 int (*led_on) (struct iwl3945_priv *priv, int led_id); 55 56 int (*led_off) (struct iwl3945_priv *priv, int led_id);
+17 -12
drivers/net/wireless/iwlwifi/iwl-led.c
··· 242 242 */ 243 243 static int iwl_leds_register_led(struct iwl_priv *priv, struct iwl_led *led, 244 244 enum led_type type, u8 set_led, 245 - const char *name, char *trigger) 245 + char *trigger) 246 246 { 247 247 struct device *device = wiphy_dev(priv->hw->wiphy); 248 248 int ret; 249 249 250 - led->led_dev.name = name; 250 + led->led_dev.name = led->name; 251 251 led->led_dev.brightness_set = iwl_led_brightness_set; 252 252 led->led_dev.default_trigger = trigger; 253 253 ··· 345 345 int iwl_leds_register(struct iwl_priv *priv) 346 346 { 347 347 char *trigger; 348 - char name[32]; 349 348 int ret; 350 349 351 350 priv->last_blink_rate = 0; ··· 353 354 priv->allow_blinking = 0; 354 355 355 356 trigger = ieee80211_get_radio_led_name(priv->hw); 356 - snprintf(name, sizeof(name), "iwl-%s:radio", 357 + snprintf(priv->led[IWL_LED_TRG_RADIO].name, 358 + sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio", 357 359 wiphy_name(priv->hw->wiphy)); 358 360 359 361 priv->led[IWL_LED_TRG_RADIO].led_on = iwl4965_led_on_reg; ··· 362 362 priv->led[IWL_LED_TRG_RADIO].led_pattern = NULL; 363 363 364 364 ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RADIO], 365 - IWL_LED_TRG_RADIO, 1, name, trigger); 365 + IWL_LED_TRG_RADIO, 1, trigger); 366 366 if (ret) 367 367 goto exit_fail; 368 368 369 369 trigger = ieee80211_get_assoc_led_name(priv->hw); 370 - snprintf(name, sizeof(name), "iwl-%s:assoc", 370 + snprintf(priv->led[IWL_LED_TRG_ASSOC].name, 371 + sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc", 371 372 wiphy_name(priv->hw->wiphy)); 372 373 373 374 ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_ASSOC], 374 - IWL_LED_TRG_ASSOC, 0, name, trigger); 375 + IWL_LED_TRG_ASSOC, 0, trigger); 375 376 376 377 /* for assoc always turn led on */ 377 378 priv->led[IWL_LED_TRG_ASSOC].led_on = iwl_led_associate; ··· 383 382 goto exit_fail; 384 383 385 384 trigger = ieee80211_get_rx_led_name(priv->hw); 386 - snprintf(name, sizeof(name), "iwl-%s:RX", wiphy_name(priv->hw->wiphy)); 387 - 385 + snprintf(priv->led[IWL_LED_TRG_RX].name, 386 + sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX", 387 + wiphy_name(priv->hw->wiphy)); 388 388 389 389 ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RX], 390 - IWL_LED_TRG_RX, 0, name, trigger); 390 + IWL_LED_TRG_RX, 0, trigger); 391 391 392 392 priv->led[IWL_LED_TRG_RX].led_on = iwl_led_associated; 393 393 priv->led[IWL_LED_TRG_RX].led_off = iwl_led_associated; ··· 398 396 goto exit_fail; 399 397 400 398 trigger = ieee80211_get_tx_led_name(priv->hw); 401 - snprintf(name, sizeof(name), "iwl-%s:TX", wiphy_name(priv->hw->wiphy)); 399 + snprintf(priv->led[IWL_LED_TRG_TX].name, 400 + sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX", 401 + wiphy_name(priv->hw->wiphy)); 402 + 402 403 ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_TX], 403 - IWL_LED_TRG_TX, 0, name, trigger); 404 + IWL_LED_TRG_TX, 0, trigger); 404 405 405 406 priv->led[IWL_LED_TRG_TX].led_on = iwl_led_associated; 406 407 priv->led[IWL_LED_TRG_TX].led_off = iwl_led_associated;
+1
drivers/net/wireless/iwlwifi/iwl-led.h
··· 52 52 struct iwl_led { 53 53 struct iwl_priv *priv; 54 54 struct led_classdev led_dev; 55 + char name[32]; 55 56 56 57 int (*led_on) (struct iwl_priv *priv, int led_id); 57 58 int (*led_off) (struct iwl_priv *priv, int led_id);