Input: leds - fix out of bound access
UI_SET_LEDBIT ioctl() causes the following KASAN splat when used with led > LED_CHARGING: [ 1274.663418] BUG: KASAN: slab-out-of-bounds in input_leds_connect+0x611/0x730 [input_leds] [ 1274.663426] Write of size 8 at addr ffff88003377b2c0 by task ckb-next-daemon/5128 This happens because we were writing to the led structure before making sure that it exists. Reported-by: Tasos Sahanidis <tasos@tasossah.com> Tested-by: Tasos Sahanidis <tasos@tasossah.com> Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
839c422736
commit
6bd6ae6396
|
@ -88,6 +88,7 @@ static int input_leds_connect(struct input_handler *handler,
|
||||||
const struct input_device_id *id)
|
const struct input_device_id *id)
|
||||||
{
|
{
|
||||||
struct input_leds *leds;
|
struct input_leds *leds;
|
||||||
|
struct input_led *led;
|
||||||
unsigned int num_leds;
|
unsigned int num_leds;
|
||||||
unsigned int led_code;
|
unsigned int led_code;
|
||||||
int led_no;
|
int led_no;
|
||||||
|
@ -119,14 +120,13 @@ static int input_leds_connect(struct input_handler *handler,
|
||||||
|
|
||||||
led_no = 0;
|
led_no = 0;
|
||||||
for_each_set_bit(led_code, dev->ledbit, LED_CNT) {
|
for_each_set_bit(led_code, dev->ledbit, LED_CNT) {
|
||||||
struct input_led *led = &leds->leds[led_no];
|
|
||||||
|
|
||||||
led->handle = &leds->handle;
|
|
||||||
led->code = led_code;
|
|
||||||
|
|
||||||
if (!input_led_info[led_code].name)
|
if (!input_led_info[led_code].name)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
led = &leds->leds[led_no];
|
||||||
|
led->handle = &leds->handle;
|
||||||
|
led->code = led_code;
|
||||||
|
|
||||||
led->cdev.name = kasprintf(GFP_KERNEL, "%s::%s",
|
led->cdev.name = kasprintf(GFP_KERNEL, "%s::%s",
|
||||||
dev_name(&dev->dev),
|
dev_name(&dev->dev),
|
||||||
input_led_info[led_code].name);
|
input_led_info[led_code].name);
|
||||||
|
|
Loading…
Reference in New Issue