diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-30 15:12:56 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-30 15:12:56 -0400 |
| commit | b5c8314f0ebadb6d8a9789cb2d646cbef8448073 (patch) | |
| tree | 81047590cad88a654a1b1a1b9b7ce457e3ad0d36 | |
| parent | 3af9a5256f448e3d0405f7905c430ef2f9f32b9c (diff) | |
| parent | 909346433064b8d840dc82af26161926b8d37558 (diff) | |
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
| -rw-r--r-- | drivers/leds/leds-pca9532.c | 8 | ||||
| -rw-r--r-- | drivers/leds/trigger/ledtrig-netdev.c | 16 |
2 files changed, 13 insertions, 11 deletions
diff --git a/drivers/leds/leds-pca9532.c b/drivers/leds/leds-pca9532.c index 7fea18b0c15d..7cb4d685a1f1 100644 --- a/drivers/leds/leds-pca9532.c +++ b/drivers/leds/leds-pca9532.c | |||
| @@ -513,6 +513,7 @@ static int pca9532_probe(struct i2c_client *client, | |||
| 513 | const struct i2c_device_id *id) | 513 | const struct i2c_device_id *id) |
| 514 | { | 514 | { |
| 515 | int devid; | 515 | int devid; |
| 516 | const struct of_device_id *of_id; | ||
| 516 | struct pca9532_data *data = i2c_get_clientdata(client); | 517 | struct pca9532_data *data = i2c_get_clientdata(client); |
| 517 | struct pca9532_platform_data *pca9532_pdata = | 518 | struct pca9532_platform_data *pca9532_pdata = |
| 518 | dev_get_platdata(&client->dev); | 519 | dev_get_platdata(&client->dev); |
| @@ -528,8 +529,11 @@ static int pca9532_probe(struct i2c_client *client, | |||
| 528 | dev_err(&client->dev, "no platform data\n"); | 529 | dev_err(&client->dev, "no platform data\n"); |
| 529 | return -EINVAL; | 530 | return -EINVAL; |
| 530 | } | 531 | } |
| 531 | devid = (int)(uintptr_t)of_match_device( | 532 | of_id = of_match_device(of_pca9532_leds_match, |
| 532 | of_pca9532_leds_match, &client->dev)->data; | 533 | &client->dev); |
| 534 | if (unlikely(!of_id)) | ||
| 535 | return -EINVAL; | ||
| 536 | devid = (int)(uintptr_t) of_id->data; | ||
| 533 | } else { | 537 | } else { |
| 534 | devid = id->driver_data; | 538 | devid = id->driver_data; |
| 535 | } | 539 | } |
diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c index 3dd3ed46d473..136f86a1627d 100644 --- a/drivers/leds/trigger/ledtrig-netdev.c +++ b/drivers/leds/trigger/ledtrig-netdev.c | |||
| @@ -122,7 +122,8 @@ static ssize_t device_name_store(struct device *dev, | |||
| 122 | trigger_data->net_dev = NULL; | 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 | if (size > 0 && trigger_data->device_name[size - 1] == '\n') | 127 | if (size > 0 && trigger_data->device_name[size - 1] == '\n') |
| 127 | trigger_data->device_name[size - 1] = 0; | 128 | trigger_data->device_name[size - 1] = 0; |
| 128 | 129 | ||
| @@ -301,11 +302,11 @@ static int netdev_trig_notify(struct notifier_block *nb, | |||
| 301 | container_of(nb, struct led_netdev_data, notifier); | 302 | container_of(nb, struct led_netdev_data, notifier); |
| 302 | 303 | ||
| 303 | if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE | 304 | if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE |
| 304 | && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER | 305 | && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER) |
| 305 | && evt != NETDEV_CHANGENAME) | ||
| 306 | return NOTIFY_DONE; | 306 | return NOTIFY_DONE; |
| 307 | 307 | ||
| 308 | if (strcmp(dev->name, trigger_data->device_name)) | 308 | if (!(dev == trigger_data->net_dev || |
| 309 | (evt == NETDEV_REGISTER && !strcmp(dev->name, trigger_data->device_name)))) | ||
| 309 | return NOTIFY_DONE; | 310 | return NOTIFY_DONE; |
| 310 | 311 | ||
| 311 | cancel_delayed_work_sync(&trigger_data->work); | 312 | cancel_delayed_work_sync(&trigger_data->work); |
| @@ -320,12 +321,9 @@ static int netdev_trig_notify(struct notifier_block *nb, | |||
| 320 | dev_hold(dev); | 321 | dev_hold(dev); |
| 321 | trigger_data->net_dev = dev; | 322 | trigger_data->net_dev = dev; |
| 322 | break; | 323 | break; |
| 323 | case NETDEV_CHANGENAME: | ||
| 324 | case NETDEV_UNREGISTER: | 324 | case NETDEV_UNREGISTER: |
| 325 | if (trigger_data->net_dev) { | 325 | dev_put(trigger_data->net_dev); |
| 326 | dev_put(trigger_data->net_dev); | 326 | trigger_data->net_dev = NULL; |
| 327 | trigger_data->net_dev = NULL; | ||
| 328 | } | ||
| 329 | break; | 327 | break; |
| 330 | case NETDEV_UP: | 328 | case NETDEV_UP: |
| 331 | case NETDEV_CHANGE: | 329 | case NETDEV_CHANGE: |
