aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/usbhid/hiddev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/usbhid/hiddev.c')
-rw-r--r--drivers/hid/usbhid/hiddev.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index 23872d08308c..a746017fac17 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -512,14 +512,24 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
512 if (cmd == HIDIOCGCOLLECTIONINDEX) { 512 if (cmd == HIDIOCGCOLLECTIONINDEX) {
513 if (uref->usage_index >= field->maxusage) 513 if (uref->usage_index >= field->maxusage)
514 goto inval; 514 goto inval;
515 uref->usage_index =
516 array_index_nospec(uref->usage_index,
517 field->maxusage);
515 } else if (uref->usage_index >= field->report_count) 518 } else if (uref->usage_index >= field->report_count)
516 goto inval; 519 goto inval;
517 } 520 }
518 521
519 if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && 522 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
520 (uref_multi->num_values > HID_MAX_MULTI_USAGES || 523 if (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
521 uref->usage_index + uref_multi->num_values > field->report_count)) 524 uref->usage_index + uref_multi->num_values >
522 goto inval; 525 field->report_count)
526 goto inval;
527
528 uref->usage_index =
529 array_index_nospec(uref->usage_index,
530 field->report_count -
531 uref_multi->num_values);
532 }
523 533
524 switch (cmd) { 534 switch (cmd) {
525 case HIDIOCGUSAGE: 535 case HIDIOCGUSAGE: