HID: be more strict when ignoring out-of-range fields
authorJiri Kosina <jkosina@suse.cz>
Mon, 31 Oct 2011 15:26:22 +0000 (16:26 +0100)
committerJiri Kosina <jkosina@suse.cz>
Wed, 16 Nov 2011 14:00:31 +0000 (15:00 +0100)
HID 1.11 specification, section 5.10 tells us:

HID class devices support the ability to ignore selected fields in a
report at run- time. This is accomplished by declaring bit field in a
report that is capable of containing a range of values larger than
those actually generated by the control. If the host or the device
receives an out-of-range value then the current value for the
respective control will not be modified.

So we shouldn't be restricted to EV_ABS only.

Reported-by: Denilson Figueiredo de Sá <denilsonsa@gmail.com>
Tested-by: Denilson Figueiredo de Sá <denilsonsa@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-input.c

index b7b0d55..6e32526 100644 (file)
@@ -822,9 +822,8 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
                return;
        }
 
-       /* Ignore absolute values that are out of bounds */
-       if ((usage->type == EV_ABS && (value < field->logical_minimum ||
-                                       value > field->logical_maximum))) {
+       /* Ignore out-of-range values as per HID specification, section 5.10 */
+       if (value < field->logical_minimum || value > field->logical_maximum) {
                dbg_hid("Ignoring out-of-range value %x\n", value);
                return;
        }