diff options
| author | Jinmo Yang <jinmo44.yang@gmail.com> | 2026-05-28 20:59:45 +0300 |
|---|---|---|
| committer | Benjamin Tissoires <bentiss@kernel.org> | 2026-06-01 19:37:23 +0300 |
| commit | 6b3014ec0e9a390ca563030b2d7689921f0daef5 (patch) | |
| tree | bf875cf596b00d11db2d69310bb5f079d9632f9d /include/linux/timerqueue.h | |
| parent | e6f4f084ecd876a333c4cf13d0229217dbfcd8e8 (diff) | |
| download | linux-6b3014ec0e9a390ca563030b2d7689921f0daef5.tar.xz | |
HID: wacom: fix slab-out-of-bounds write in wacom_wac_queue_insert
wacom_wac_queue_insert() calls kfifo_skip() in a loop when the kfifo
doesn't have enough space for the incoming report. If the kfifo is
empty, kfifo_skip() reads stale data left in the kmalloc'd buffer
via __kfifo_peek_n() and interprets it as a record length, advancing
fifo->out by that garbage value. This corrupts the internal kfifo
state, causing kfifo_unused() to return a value much larger than the
actual buffer size, which bypasses __kfifo_in_r()'s guard:
if (len + recsize > kfifo_unused(fifo))
return 0;
kfifo_copy_in() then performs an out-of-bounds memcpy, writing up to
3842 bytes past the 256-byte buffer.
Add a !kfifo_is_empty() condition to the while loop so kfifo_skip()
is never called on an empty fifo, and check the return value of
kfifo_in() to reject reports that are too large for the fifo.
Suggested-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Fixes: 5e013ad20689 ("HID: wacom: Remove static WACOM_PKGLEN_MAX limit")
Cc: stable@vger.kernel.org
Signed-off-by: Jinmo Yang <jinmo44.yang@gmail.com>
Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
Diffstat (limited to 'include/linux/timerqueue.h')
0 files changed, 0 insertions, 0 deletions
