Skip to content

Commit 0a3fe97

Browse files
lag-linaroBenjamin Tissoires
authored andcommitted
HID: core: Mitigate potential OOB by removing bogus memset()
The memset() in hid_report_raw_event() has the good intention of clearing out bogus data by zeroing the area from the end of the incoming data string to the assumed end of the buffer. However, as we have previously seen, doing so can easily result in OOB reads and writes in the subsequent thread of execution. The current suggestion from one of the HID maintainers is to remove the memset() and simply return if the incoming event buffer size is not large enough to fill the associated report. Suggested-by Benjamin Tissoires <bentiss@kernel.org> Signed-off-by: Lee Jones <lee@kernel.org> [bentiss: changed the return value] Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
1 parent 4bc7bc4 commit 0a3fe97

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

drivers/hid/hid-core.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,9 +2057,10 @@ int hid_report_raw_event(struct hid_device *hid, enum hid_report_type type, u8 *
20572057
rsize = max_buffer_size;
20582058

20592059
if (csize < rsize) {
2060-
dbg_hid("report %d is too short, (%d < %d)\n", report->id,
2061-
csize, rsize);
2062-
memset(cdata + csize, 0, rsize - csize);
2060+
hid_warn_ratelimited(hid, "Event data for report %d was too short (%d vs %d)\n",
2061+
report->id, rsize, csize);
2062+
ret = -EINVAL;
2063+
goto out;
20632064
}
20642065

20652066
if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)

0 commit comments

Comments
 (0)