linux_dsm_epyc7002/drivers/usb/gadget/legacy
Alan Stern 520b72fc64 USB: gadgetfs: Fix crash caused by inadequate synchronization
The gadgetfs driver (drivers/usb/gadget/legacy/inode.c) was written
before the UDC and composite frameworks were adopted; it is a legacy
driver.  As such, it expects that once bound to a UDC controller, it
will not be unbound until it unregisters itself.

However, the UDC framework does unbind function drivers while they are
still registered.  When this happens, it can cause the gadgetfs driver
to misbehave or crash.  For example, userspace can cause a crash by
opening the device file and doing an ioctl call before setting up a
configuration (found by Andrey Konovalov using the syzkaller fuzzer).

This patch adds checks and synchronization to prevent these bad
behaviors.  It adds a udc_usage counter that the driver increments at
times when it is using a gadget interface without holding the private
spinlock.  The unbind routine waits for this counter to go to 0 before
returning, thereby ensuring that the UDC is no longer in use.

The patch also adds a check in the dev_ioctl() routine to make sure
the driver is bound to a UDC before dereferencing the gadget pointer,
and it makes destroy_ep_files() synchronize with the endpoint I/O
routines, to prevent the user from accessing an endpoint data
structure after it has been removed.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Reported-by: Andrey Konovalov <andreyknvl@google.com>
Tested-by: Andrey Konovalov <andreyknvl@google.com>
CC: <stable@vger.kernel.org>
Acked-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-09-22 18:29:00 +02:00
..
acm_ms.c usb: f_mass_storage: test whether thread is running before starting another 2016-04-19 11:11:56 +03:00
audio.c usb: gadget: add f_uac1 variant based on a new u_audio api 2017-06-19 09:22:47 +03:00
cdc2.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00
dbgp.c usb: gadget: legacy: dbgp: eliminate abuse of ep->driver data 2015-09-27 10:54:31 -05:00
ether.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00
g_ffs.c usb: gadget: fix unused-but-set-variale warnings 2016-06-21 11:04:09 +03:00
gmidi.c usb: gadget: f_midi: defaults buflen sizes to 512 2016-08-25 12:13:15 +03:00
hid.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00
inode.c USB: gadgetfs: Fix crash caused by inadequate synchronization 2017-09-22 18:29:00 +02:00
Kconfig usb: gadget: add f_uac1 variant based on a new u_audio api 2017-06-19 09:22:47 +03:00
Makefile usb: gadget: webcam: convert webcam to new interface of f_uvc 2014-09-09 09:49:31 -05:00
mass_storage.c usb: gadget: mass_storage: set msg_registered after msg registered 2017-06-13 13:21:08 +03:00
multi.c usb: f_mass_storage: test whether thread is running before starting another 2016-04-19 11:11:56 +03:00
ncm.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00
nokia.c usb: f_mass_storage: test whether thread is running before starting another 2016-04-19 11:11:56 +03:00
printer.c usb: gadget: printer: Remove pnp_string static buffer 2017-01-24 11:04:08 +02:00
serial.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00
tcm_usb_gadget.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending 2016-01-20 17:20:53 -08:00
webcam.c USB: gadget: remove unneeded MODULE_VERSION() usage 2017-07-22 15:56:53 +02:00
zero.c usb: gadget: composite: remove redundant bcdUSB setting in legacy 2015-12-15 09:12:41 -06:00