projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
ac9a786
)
USB: usbtmc: Fix direction for 0-length ioctl control messages
author
Alan Stern
<stern@rowland.harvard.edu>
Mon, 1 May 2023 18:22:35 +0000
(14:22 -0400)
committer
Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Sat, 13 May 2023 08:25:49 +0000
(17:25 +0900)
The syzbot fuzzer found a problem in the usbtmc driver: When a user
submits an ioctl for a 0-length control transfer, the driver does not
check that the direction is set to OUT:
------------[ cut here ]------------
usb 3-1: BOGUS control dir, pipe
80000b80
doesn't match bRequestType fd
WARNING: CPU: 0 PID: 5100 at drivers/usb/core/urb.c:411 usb_submit_urb+0x14a7/0x1880 drivers/usb/core/urb.c:411
Modules linked in:
CPU: 0 PID: 5100 Comm: syz-executor428 Not tainted
6.3.0-syzkaller-12049-g58390c8ce1bd
#0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/14/2023
RIP: 0010:usb_submit_urb+0x14a7/0x1880 drivers/usb/core/urb.c:411
Code: 7c 24 40 e8 1b 13 5c fb 48 8b 7c 24 40 e8 21 1d f0 fe 45 89 e8 44 89 f1 4c 89 e2 48 89 c6 48 c7 c7 e0 b5 fc 8a e8 19 c8 23 fb <0f> 0b e9 9f ee ff ff e8 ed 12 5c fb 0f b6 1d 12 8a 3c 08 31 ff 41
RSP: 0018:
ffffc90003d2fb00
EFLAGS:
00010282
RAX:
0000000000000000
RBX:
ffff8880789e9058
RCX:
0000000000000000
RDX:
ffff888029593b80
RSI:
ffffffff814c1447
RDI:
0000000000000001
RBP:
ffff88801ea742f8
R08:
0000000000000001
R09:
0000000000000000
R10:
0000000000000001
R11:
0000000000000001
R12:
ffff88802915e528
R13:
00000000000000fd
R14:
0000000080000b80
R15:
ffff8880222b3100
FS:
0000555556ca63c0
(0000) GS:
ffff8880b9800000
(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
00007f9ef4d18150
CR3:
0000000073e5b000
CR4:
00000000003506f0
DR0:
0000000000000000
DR1:
0000000000000000
DR2:
0000000000000000
DR3:
0000000000000000
DR6:
00000000fffe0ff0
DR7:
0000000000000400
Call Trace:
<TASK>
usb_start_wait_urb+0x101/0x4b0 drivers/usb/core/message.c:58
usb_internal_control_msg drivers/usb/core/message.c:102 [inline]
usb_control_msg+0x320/0x4a0 drivers/usb/core/message.c:153
usbtmc_ioctl_request drivers/usb/class/usbtmc.c:1954 [inline]
usbtmc_ioctl+0x1b3d/0x2840 drivers/usb/class/usbtmc.c:2097
To fix this, we must override the direction in the bRequestType field
of the control request structure when the length is 0.
Reported-and-tested-by: syzbot+ce77725b89b7bd52425c@syzkaller.appspotmail.com
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Link:
https://lore.kernel.org/linux-usb/000000000000716a3705f9adb8ee@google.com/
CC: <stable@vger.kernel.org>
Link:
https://lore.kernel.org/r/ede1ee02-b718-49e7-a44c-51339fec706b@rowland.harvard.edu
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/class/usbtmc.c
patch
|
blob
|
history
diff --git
a/drivers/usb/class/usbtmc.c
b/drivers/usb/class/usbtmc.c
index 4bb6d304eb4b21fe3049f44ca000826af2c40ff0..311007b1d9046566b8a155c21ef8188cca13a819 100644
(file)
--- a/
drivers/usb/class/usbtmc.c
+++ b/
drivers/usb/class/usbtmc.c
@@
-1928,6
+1928,8
@@
static int usbtmc_ioctl_request(struct usbtmc_device_data *data,
if (request.req.wLength > USBTMC_BUFSIZE)
return -EMSGSIZE;
+ if (request.req.wLength == 0) /* Length-0 requests are never IN */
+ request.req.bRequestType &= ~USB_DIR_IN;
is_in = request.req.bRequestType & USB_DIR_IN;