Skip to content

Commit 2497ff3

Browse files
kenkinming2002Benjamin Tissoires
authored andcommitted
HID: i2c-hid: fix potential buffer overflow in i2c_hid_get_report()
`i2c_hid_xfer` is used to read `recv_len + sizeof(__le16)` bytes of data into `ihid->rawbuf`. The former can come from the userspace in the hidraw driver and is only bounded by HID_MAX_BUFFER_SIZE(16384) by default (unless we also set `max_buffer_size` field of `struct hid_ll_driver` which we do not). The latter has size determined at runtime by the maximum size of different report types you could receive on any particular device and can be a much smaller value. Fix this by truncating `recv_len` to `ihid->bufsize - sizeof(__le16)`. The impact is low since access to hidraw devices requires root. Signed-off-by: Kwok Kin Ming <kenkinming2002@gmail.com> Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
1 parent f287ba5 commit 2497ff3

1 file changed

Lines changed: 1 addition & 0 deletions

File tree

drivers/hid/i2c-hid/i2c-hid-core.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ static int i2c_hid_get_report(struct i2c_hid *ihid,
286286
* In addition to report data device will supply data length
287287
* in the first 2 bytes of the response, so adjust .
288288
*/
289+
recv_len = min(recv_len, ihid->bufsize - sizeof(__le16));
289290
error = i2c_hid_xfer(ihid, ihid->cmdbuf, length,
290291
ihid->rawbuf, recv_len + sizeof(__le16));
291292
if (error) {

0 commit comments

Comments
 (0)