kernel-fxtec-pro1x/drivers/usb/core
Alan Stern 661595bc36 USB: core: Fix misleading driver bug report
[ Upstream commit ac854131d9844f79e2fdcef67a7707227538d78a ]

The syzbot fuzzer found a race between URB submission to endpoint 0
and device reset.  Namely, during the reset we call usb_ep0_reinit()
because the characteristics of ep0 may have changed (if the reset
follows a firmware update, for example).  While usb_ep0_reinit() is
running there is a brief period during which the pointers stored in
udev->ep_in[0] and udev->ep_out[0] are set to NULL, and if an URB is
submitted to ep0 during that period, usb_urb_ep_type_check() will
report it as a driver bug.  In the absence of those pointers, the
routine thinks that the endpoint doesn't exist.  The log message looks
like this:

------------[ cut here ]------------
usb 2-1: BOGUS urb xfer, pipe 2 != type 2
WARNING: CPU: 0 PID: 9241 at drivers/usb/core/urb.c:478
usb_submit_urb+0x1188/0x1460 drivers/usb/core/urb.c:478

Now, although submitting an URB while the device is being reset is a
questionable thing to do, it shouldn't count as a driver bug as severe
as submitting an URB for an endpoint that doesn't exist.  Indeed,
endpoint 0 always exists, even while the device is in its unconfigured
state.

To prevent these misleading driver bug reports, this patch updates
usb_disable_endpoint() to avoid clearing the ep_in[] and ep_out[]
pointers when the endpoint being disabled is ep0.  There's no danger
of leaving a stale pointer in place, because the usb_host_endpoint
structure being pointed to is stored permanently in udev->ep0; it
doesn't get deallocated until the entire usb_device structure does.

Reported-and-tested-by: syzbot+db339689b2101f6f6071@syzkaller.appspotmail.com
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>

Link: https://lore.kernel.org/r/Pine.LNX.4.44L0.2005011558590.903-100000@netrider.rowland.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-05-27 17:37:34 +02:00
..
buffer.c
config.c USB: core: add endpoint-blacklist quirk 2020-02-28 16:38:46 +01:00
devices.c
devio.c usb: usbfs: Suppress problematic bind and unbind uevents. 2019-12-31 16:35:16 +01:00
driver.c USB: core: Fix bug caused by duplicate interface PM usage counter 2019-05-08 07:21:44 +02:00
endpoint.c
file.c USB: core: Fix races in character device registration and deregistraion 2019-08-25 10:47:59 +02:00
generic.c
hcd-pci.c usb: hcd: use managed device resources 2019-09-06 10:22:15 +02:00
hcd.c usb: core: Add PM runtime calls to usb_hcd_platform_shutdown 2019-05-31 06:46:30 -07:00
hub.c usb: core: hub: limit HUB_QUIRK_DISABLE_AUTOSUSPEND to USB5534B 2020-05-20 08:18:47 +02:00
hub.h USB: hub: Fix the broken detection of USB3 device in SMSC hub 2020-02-28 16:38:47 +01:00
Kconfig
ledtrig-usbport.c USB: leds: fix regression in usbport led trigger 2019-01-31 08:14:34 +01:00
Makefile
message.c USB: core: Fix misleading driver bug report 2020-05-27 17:37:34 +02:00
notify.c
of.c
otg_whitelist.h
phy.c
phy.h
port.c usb: core: port: do error out if usb_autopm_get_interface() fails 2020-03-11 14:14:59 +01:00
quirks.c USB: Add USB_QUIRK_DELAY_CTRL_MSG and USB_QUIRK_DELAY_INIT for Corsair K70 RGB RAPIDFIRE 2020-04-29 16:31:26 +02:00
sysfs.c USB: Add new USB LPM helpers 2019-05-02 09:58:56 +02:00
urb.c usb: core: urb: fix URB structure initialization function 2019-12-17 20:34:41 +01:00
usb-acpi.c
usb.c USB: check usb_get_extra_descriptor for proper size 2018-12-13 09:16:15 +01:00
usb.h USB: core: add endpoint-blacklist quirk 2020-02-28 16:38:46 +01:00