diff options
Diffstat (limited to 'drivers/hid/usbhid/hiddev.c')
-rw-r--r-- | drivers/hid/usbhid/hiddev.c | 18 |
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: |