Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

HID: logitech-dj: check report length

Malicious USB devices can send bogus reports smaller than the expected
buffer size. Ensure that the length is valid to avoid reading out of
bounds.

Signed-off-by: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by

Peter Wu and committed by
Jiri Kosina
f254ae93 0349678c

+15 -1
+15 -1
drivers/hid/hid-logitech-dj.c
··· 962 962 963 963 switch (data[0]) { 964 964 case REPORT_ID_DJ_SHORT: 965 + if (size != DJREPORT_SHORT_LENGTH) { 966 + dev_err(&hdev->dev, "DJ report of bad size (%d)", size); 967 + return false; 968 + } 965 969 return logi_dj_dj_event(hdev, report, data, size); 966 970 case REPORT_ID_HIDPP_SHORT: 967 - /* intentional fallthrough */ 971 + if (size != HIDPP_REPORT_SHORT_LENGTH) { 972 + dev_err(&hdev->dev, 973 + "Short HID++ report of bad size (%d)", size); 974 + return false; 975 + } 976 + return logi_dj_hidpp_event(hdev, report, data, size); 968 977 case REPORT_ID_HIDPP_LONG: 978 + if (size != HIDPP_REPORT_LONG_LENGTH) { 979 + dev_err(&hdev->dev, 980 + "Long HID++ report of bad size (%d)", size); 981 + return false; 982 + } 969 983 return logi_dj_hidpp_event(hdev, report, data, size); 970 984 } 971 985