Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'led-fixes-for-5.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds

Pull LED fixes from Jacek Anaszewski:

- fix refcnt leak on interface rename

- use memcpy in device_name_store() to avoid including garbage from a
previous, longer value in the device_name

- fix a potential NULL pointer dereference in case of_match_device()
cannot find a match

* tag 'led-fixes-for-5.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds:
leds: trigger: netdev: use memcpy in device_name_store
leds: pca9532: fix a potential NULL pointer dereference
leds: trigger: netdev: fix refcnt leak on interface rename

+13 -11
+6 -2
drivers/leds/leds-pca9532.c
··· 513 513 const struct i2c_device_id *id) 514 514 { 515 515 int devid; 516 + const struct of_device_id *of_id; 516 517 struct pca9532_data *data = i2c_get_clientdata(client); 517 518 struct pca9532_platform_data *pca9532_pdata = 518 519 dev_get_platdata(&client->dev); ··· 529 528 dev_err(&client->dev, "no platform data\n"); 530 529 return -EINVAL; 531 530 } 532 - devid = (int)(uintptr_t)of_match_device( 533 - of_pca9532_leds_match, &client->dev)->data; 531 + of_id = of_match_device(of_pca9532_leds_match, 532 + &client->dev); 533 + if (unlikely(!of_id)) 534 + return -EINVAL; 535 + devid = (int)(uintptr_t) of_id->data; 534 536 } else { 535 537 devid = id->driver_data; 536 538 }
+7 -9
drivers/leds/trigger/ledtrig-netdev.c
··· 122 122 trigger_data->net_dev = NULL; 123 123 } 124 124 125 - strncpy(trigger_data->device_name, buf, size); 125 + memcpy(trigger_data->device_name, buf, size); 126 + trigger_data->device_name[size] = 0; 126 127 if (size > 0 && trigger_data->device_name[size - 1] == '\n') 127 128 trigger_data->device_name[size - 1] = 0; 128 129 ··· 302 301 container_of(nb, struct led_netdev_data, notifier); 303 302 304 303 if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE 305 - && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER 306 - && evt != NETDEV_CHANGENAME) 304 + && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER) 307 305 return NOTIFY_DONE; 308 306 309 - if (strcmp(dev->name, trigger_data->device_name)) 307 + if (!(dev == trigger_data->net_dev || 308 + (evt == NETDEV_REGISTER && !strcmp(dev->name, trigger_data->device_name)))) 310 309 return NOTIFY_DONE; 311 310 312 311 cancel_delayed_work_sync(&trigger_data->work); ··· 321 320 dev_hold(dev); 322 321 trigger_data->net_dev = dev; 323 322 break; 324 - case NETDEV_CHANGENAME: 325 323 case NETDEV_UNREGISTER: 326 - if (trigger_data->net_dev) { 327 - dev_put(trigger_data->net_dev); 328 - trigger_data->net_dev = NULL; 329 - } 324 + dev_put(trigger_data->net_dev); 325 + trigger_data->net_dev = NULL; 330 326 break; 331 327 case NETDEV_UP: 332 328 case NETDEV_CHANGE: