Input: rc-keymap - return KEY_RESERVED for unknown mappings

Do not respond with -EINVAL to EVIOCGKEYCODE for not-yet-mapped
scancodes, but rather return KEY_RESERVED.

This fixes breakage with Ubuntu's input-kbd utility that stopped
returning full keymaps for remote controls.

Tested-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Tested-by: Mark Lord <kernel@teksavvy.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Dmitry Torokhov and committed by Linus Torvalds 54e74b87 1ca05b7f

+17 -11
+17 -11
drivers/media/rc/rc-main.c
··· 458 458 index = ir_lookup_by_scancode(rc_map, scancode); 459 459 } 460 460 461 - if (index >= rc_map->len) { 462 - if (!(ke->flags & INPUT_KEYMAP_BY_INDEX)) 463 - IR_dprintk(1, "unknown key for scancode 0x%04x\n", 464 - scancode); 461 + if (index < rc_map->len) { 462 + entry = &rc_map->scan[index]; 463 + 464 + ke->index = index; 465 + ke->keycode = entry->keycode; 466 + ke->len = sizeof(entry->scancode); 467 + memcpy(ke->scancode, &entry->scancode, sizeof(entry->scancode)); 468 + 469 + } else if (!(ke->flags & INPUT_KEYMAP_BY_INDEX)) { 470 + /* 471 + * We do not really know the valid range of scancodes 472 + * so let's respond with KEY_RESERVED to anything we 473 + * do not have mapping for [yet]. 474 + */ 475 + ke->index = index; 476 + ke->keycode = KEY_RESERVED; 477 + } else { 465 478 retval = -EINVAL; 466 479 goto out; 467 480 } 468 - 469 - entry = &rc_map->scan[index]; 470 - 471 - ke->index = index; 472 - ke->keycode = entry->keycode; 473 - ke->len = sizeof(entry->scancode); 474 - memcpy(ke->scancode, &entry->scancode, sizeof(entry->scancode)); 475 481 476 482 retval = 0; 477 483