linux/drivers/usb/core
Daniel Mack b3a3dd074f USB: fix gathering of interface associations
TEAC's UD-H01 (and probably other devices) have a gap in the interface
number allocation of their descriptors:

  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          220
    bNumInterfaces          3
    [...]
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      [...]
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         2
      bInterfaceCount         2
      bFunctionClass          1 Audio
      bFunctionSubClass       0
      bFunctionProtocol      32
      iFunction               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      [...]

Once a configuration is selected, usb_set_configuration() walks the
known interfaces of a given configuration and calls find_iad() on
each of them to set the interface association pointer the interface
is included in.

The problem here is that the loop variable is taken for the interface
number in the comparison logic that gathers the association. Which is
fine as long as the descriptors are sane.

In the case above, however, the logic gets out of sync and the
interface association fields of all interfaces beyond the interface
number gap are wrong.

Fix this by passing the interface's bInterfaceNumber to find_iad()
instead.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Reported-by: bEN <ml_all@circa.be>
Reported-by: Ivan Perrone <ivanperrone@hotmail.com>
Tested-by: ivan perrone <ivanperrone@hotmail.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-06-14 17:13:34 -07:00
..
buffer.c USB: Core: Fix minor coding style issues 2011-01-22 19:35:39 -08:00
config.c usbcore: get BOS descriptor set 2011-09-26 15:51:08 -07:00
devices.c Revert "usb: move struct usb_device->children to struct usb_hub_port->child" 2012-05-14 09:20:37 -07:00
devio.c USB: Remove races in devio.c 2012-05-18 16:37:55 -07:00
driver.c USB: Disable USB 3.0 LPM in critical sections. 2012-05-18 15:41:59 -07:00
endpoint.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
file.c USB: file.c: remove dbg() usage 2012-05-01 21:33:35 -07:00
generic.c USB: accept RNDIS configs if there's no alternative 2010-08-10 14:35:43 -07:00
hcd-pci.c USB: add NO_D3_DURING_SLEEP flag and revert 151b612847 2012-06-13 13:11:39 -07:00
hcd.c USB: Make sure to fetch the BOS desc for roothubs. 2012-05-18 15:41:53 -07:00
hub.c USB: Checking the wrong variable in usb_disable_lpm() 2012-06-13 16:37:21 -07:00
Kconfig usb: Kconfig: remove unneeded default value 2012-05-14 08:49:50 -07:00
Makefile usb: Bind devices to ACPI devices when possible 2012-05-11 17:06:13 -07:00
message.c USB: fix gathering of interface associations 2012-06-14 17:13:34 -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
quirks.c usb: add USB_QUIRK_RESET_RESUME for M-Audio 88es 2012-04-30 10:26:42 -04:00
sysfs.c sysfs: get rid of some lockdep false positives 2012-05-14 12:19:56 -07:00
urb.c usbhid: prevent deadlock during timeout 2012-05-01 13:22:13 -04:00
usb-acpi.c usb: Set device removable state based on ACPI USB data 2012-05-11 17:07:02 -07:00
usb.c usb: fix breakage on systems without ACPI 2012-05-16 05:29:19 -07:00
usb.h usb: Bind devices to ACPI devices when possible 2012-05-11 17:06:13 -07:00