linux/drivers/usb/core
Alan Stern 7d7ded5440 USB: fix invalid memory access in hub_activate()
commit e50293ef97 upstream.

Commit 8520f38099 ("USB: change hub initialization sleeps to
delayed_work") changed the hub_activate() routine to make part of it
run in a workqueue.  However, the commit failed to take a reference to
the usb_hub structure or to lock the hub interface while doing so.  As
a result, if a hub is plugged in and quickly unplugged before the work
routine can run, the routine will try to access memory that has been
deallocated.  Or, if the hub is unplugged while the routine is
running, the memory may be deallocated while it is in active use.

This patch fixes the problem by taking a reference to the usb_hub at
the start of hub_activate() and releasing it at the end (when the work
is finished), and by locking the hub interface while the work routine
is running.  It also adds a check at the start of the routine to see
if the hub has already been disconnected, in which nothing should be
done.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Reported-by: Alexandru Cornea <alexandru.cornea@intel.com>
Tested-by: Alexandru Cornea <alexandru.cornea@intel.com>
Fixes: 8520f38099 ("USB: change hub initialization sleeps to delayed_work")
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[ luis: backported to 3.16:
  - Added forward declaration of hub_release() which mainline had with commit
    32a6958998 ("usb: hub: convert khubd into workqueue") ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
History 2016-01-25 10:43:48 +00:00
..
buffer.c usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN 2015-02-24 10:01:02 +00:00
config.c usb: Use the USB_SS_MULT() macro to decode burst multiplier for log message 2016-01-11 10:50:17 +00:00
devices.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2013-02-26 20:16:07 -08:00
devio.c USB: usbfs: allow URBs to be reaped after disconnection 2015-08-11 09:57:29 +01:00
driver.c USB: add flag for HCDs that can't receive wakeup requests (isp1760-hcd) 2015-03-02 13:16:59 +00:00
endpoint.c USB: core: be specific about attribute permissions 2013-08-25 15:12:03 -07:00
file.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2013-11-13 15:34:18 +09:00
generic.c staging: usbip: convert usbip-host driver to usb_device_driver 2014-02-07 10:54:30 -08:00
hcd-pci.c usb: remove redundant D0 power state set 2014-05-27 15:18:48 -07:00
hcd.c usb: core: lpm: set lpm_capable for root hub device 2015-08-11 09:57:41 +01:00
hub.c USB: fix invalid memory access in hub_activate() 2016-01-25 10:43:48 +00:00
hub.h usb: fix hub-port pm_runtime_enable() vs runtime pm transitions 2014-06-17 17:04:39 -07:00
Kconfig usb: common: rename phy-fsm-usb.c to usb-otg-fsm.c 2014-05-27 15:29:44 -07:00
Makefile USB: core: remove CONFIG_USB_DEBUG usage 2013-12-21 16:01:00 -08:00
message.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2014-04-02 16:23:38 -07:00
notify.c usb: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:25 -04:00
otg_whitelist.h USB: Add OTG PET device to TPL 2015-02-04 10:58:14 +00:00
port.c usb: fix hub-port pm_runtime_enable() vs runtime pm transitions 2014-06-17 17:04:39 -07:00
quirks.c USB: add quirk for devices with broken LPM 2016-01-18 22:27:28 +00:00
sysfs.c USB: core: correct spelling mistakes in comments and warning 2014-01-07 16:17:40 -08:00
urb.c Merge branch 'master' into for-next 2014-02-20 14:54:28 +01:00
usb-acpi.c usb: find internal hub tier mismatch via acpi 2014-05-27 16:38:52 -07:00
usb.c usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN 2015-02-24 10:01:02 +00:00
usb.h usb: core: lpm: set lpm_capable for root hub device 2015-08-11 09:57:41 +01:00