mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
usb: usbtmc: check URB actual_length for interrupt-IN notifications
USBTMC devices can use an optional interrupt endpoint for notification
messages. These typically contain two-byte headers indicating the
payload format, but the driver does not check if these headers are
present before accessing the data buffers. In cases where the URB
actual_length is not enough to fit these headers, the driver will either
cause an out-of-bounds read, or consume stale leftover data from a
previous notification.
Fix by checking if actual_data contains enough bytes for the headers,
otherwise resubmit URB to the interrupt endpoint.
Fixes: dbf3e7f654 ("Implement an ioctl to support the USMTMC-USB488 READ_STATUS_BYTE operation.")
Reported-by: syzbot+abbfd103085885cf16a2@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=abbfd103085885cf16a2
Cc: stable <stable@kernel.org>
Suggested-by: Michal Pecio <michal.pecio@gmail.com>
Signed-off-by: Heitor Alves de Siqueira <halves@igalia.com>
Link: https://patch.msgid.link/20260505-usbtmc-iin-size-v3-1-a36113f62db7@igalia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5a4c828b8b
commit
52f2ad3f7e
|
|
@ -2306,6 +2306,14 @@ static void usbtmc_interrupt(struct urb *urb)
|
|||
|
||||
switch (status) {
|
||||
case 0: /* SUCCESS */
|
||||
/* ensure at least two bytes of headers were transferred */
|
||||
if (urb->actual_length < 2) {
|
||||
dev_warn(dev,
|
||||
"actual length %d not sufficient for interrupt headers\n",
|
||||
urb->actual_length);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* check for valid STB notification */
|
||||
if (data->iin_buffer[0] > 0x81) {
|
||||
data->bNotify1 = data->iin_buffer[0];
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user