On Tue, Sep 01, 2020 at 09:12:09PM +0200, Pavel Machek wrote: > Hi! > > > commit 25a097f5204675550afb879ee18238ca917cba7a upstream. > > > > `uref->usage_index` is not always being properly checked, causing > > hiddev_ioctl_usage() to go out of bounds under some cases. Fix it. > > Well, the code is quite confusig, but: > > a) does HIDIOCGCOLLECTIONINDEX need same checking? It's checked in the previous switch statement. > > b) should we check this using some kind of _nospec() variant to > prevent speculation attacks? I don't think so. I wrote up an explanation earlier just because the code was so confusing. https://lkml.org/lkml/2020/7/20/523 regards, dan carpenter
--- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -532,12 +532,16 @@ static noinline int hiddev_ioctl_usage(s switch (cmd) { case HIDIOCGUSAGE: + if (uref->usage_index >= field->report_count) + goto inval; uref->value = field->value[uref->usage_index]; if (copy_to_user(user_arg, uref, sizeof(*uref))) goto fault; goto goodreturn; case HIDIOCSUSAGE: + if (uref->usage_index >= field->report_count) + goto inval; field->value[uref->usage_index] = uref->value; goto goodreturn;