Skip to content

Commit c843515

Browse files
Nikita Zhandarovichgregkh
authored andcommitted
net: usb: rtl8150: enable basic endpoint checking
commit 90b7f29 upstream. Syzkaller reports [1] encountering a common issue of utilizing a wrong usb endpoint type during URB submitting stage. This, in turn, triggers a warning shown below. For now, enable simple endpoint checking (specifically, bulk and interrupt eps, testing control one is not essential) to mitigate the issue with a view to do other related cosmetic changes later, if they are necessary. [1] Syzkaller report: usb 1-1: BOGUS urb xfer, pipe 3 != type 1 WARNING: CPU: 1 PID: 2586 at drivers/usb/core/urb.c:503 usb_submit_urb+0xe4b/0x1730 driv> Modules linked in: CPU: 1 UID: 0 PID: 2586 Comm: dhcpcd Not tainted 6.11.0-rc4-syzkaller-00069-gfc88bb11617> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/06/2024 RIP: 0010:usb_submit_urb+0xe4b/0x1730 drivers/usb/core/urb.c:503 Code: 84 3c 02 00 00 e8 05 e4 fc fc 4c 89 ef e8 fd 25 d7 fe 45 89 e0 89 e9 4c 89 f2 48 8> RSP: 0018:ffffc9000441f740 EFLAGS: 00010282 RAX: 0000000000000000 RBX: ffff888112487a00 RCX: ffffffff811a99a9 RDX: ffff88810df6ba80 RSI: ffffffff811a99b6 RDI: 0000000000000001 RBP: 0000000000000003 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000001 R13: ffff8881023bf0a8 R14: ffff888112452a20 R15: ffff888112487a7c FS: 00007fc04eea5740(0000) GS:ffff8881f6300000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f0a1de9f870 CR3: 000000010dbd0000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> rtl8150_open+0x300/0xe30 drivers/net/usb/rtl8150.c:733 __dev_open+0x2d4/0x4e0 net/core/dev.c:1474 __dev_change_flags+0x561/0x720 net/core/dev.c:8838 dev_change_flags+0x8f/0x160 net/core/dev.c:8910 devinet_ioctl+0x127a/0x1f10 net/ipv4/devinet.c:1177 inet_ioctl+0x3aa/0x3f0 net/ipv4/af_inet.c:1003 sock_do_ioctl+0x116/0x280 net/socket.c:1222 sock_ioctl+0x22e/0x6c0 net/socket.c:1341 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl fs/ioctl.c:893 [inline] __x64_sys_ioctl+0x193/0x220 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fc04ef73d49 ... This change has not been tested on real hardware. Reported-and-tested-by: [email protected] Closes: https://syzkaller.appspot.com/bug?extid=d7e968426f644b567e31 Fixes: 1da177e ("Linux-2.6.12-rc2") Cc: [email protected] Signed-off-by: Nikita Zhandarovich <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent a788149 commit c843515

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

drivers/net/usb/rtl8150.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@
7171
#define MSR_SPEED (1<<3)
7272
#define MSR_LINK (1<<2)
7373

74+
/* USB endpoints */
75+
enum rtl8150_usb_ep {
76+
RTL8150_USB_EP_CONTROL = 0,
77+
RTL8150_USB_EP_BULK_IN = 1,
78+
RTL8150_USB_EP_BULK_OUT = 2,
79+
RTL8150_USB_EP_INT_IN = 3,
80+
};
81+
7482
/* Interrupt pipe data */
7583
#define INT_TSR 0x00
7684
#define INT_RSR 0x01
@@ -867,6 +875,13 @@ static int rtl8150_probe(struct usb_interface *intf,
867875
struct usb_device *udev = interface_to_usbdev(intf);
868876
rtl8150_t *dev;
869877
struct net_device *netdev;
878+
static const u8 bulk_ep_addr[] = {
879+
RTL8150_USB_EP_BULK_IN | USB_DIR_IN,
880+
RTL8150_USB_EP_BULK_OUT | USB_DIR_OUT,
881+
0};
882+
static const u8 int_ep_addr[] = {
883+
RTL8150_USB_EP_INT_IN | USB_DIR_IN,
884+
0};
870885

871886
netdev = alloc_etherdev(sizeof(rtl8150_t));
872887
if (!netdev)
@@ -880,6 +895,13 @@ static int rtl8150_probe(struct usb_interface *intf,
880895
return -ENOMEM;
881896
}
882897

898+
/* Verify that all required endpoints are present */
899+
if (!usb_check_bulk_endpoints(intf, bulk_ep_addr) ||
900+
!usb_check_int_endpoints(intf, int_ep_addr)) {
901+
dev_err(&intf->dev, "couldn't find required endpoints\n");
902+
goto out;
903+
}
904+
883905
tasklet_setup(&dev->tl, rx_fixup);
884906
spin_lock_init(&dev->rx_pool_lock);
885907

0 commit comments

Comments
 (0)