diff --git a/drivers/leds/led-class-multicolor.c b/drivers/leds/led-class-multicolor.c index ec62a4811613..f3fd043cb185 100644 --- a/drivers/leds/led-class-multicolor.c +++ b/drivers/leds/led-class-multicolor.c @@ -42,22 +42,27 @@ static ssize_t multi_intensity_store(struct device *dev, mutex_lock(&led_cdev->led_access); - for (i = 0; i < mcled_cdev->num_colors; i++) { + for (i = 0; i < LED_COLOR_ID_MAX; i++) { ret = sscanf(buf + offset, "%i%n", &intensity_value[i], &nrchars); - if (ret != 1) { - ret = -EINVAL; - goto err_out; - } + if (ret != 1) + break; offset += nrchars; } + /* Expect newline; reject surplus trailing chars */ offset++; if (offset < size) { ret = -EINVAL; goto err_out; } + /* Require at least the physical number of colors */ + if (i < mcled_cdev->num_colors) { + ret = -EINVAL; + goto err_out; + } + for (i = 0; i < mcled_cdev->num_colors; i++) mcled_cdev->subled_info[i].intensity = intensity_value[i];