diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-18 19:19:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-18 19:19:15 -0400 |
commit | 040e3abbb958f5a038c16c1af7258e396303c2e1 (patch) | |
tree | e010c76f04d025599dd740faa83791cf482ff178 /drivers/usb | |
parent | f7813ad5cbfd1fab2899914281b72a1ba0805c80 (diff) | |
parent | 55ff8cfbc4e12a7d2187df523938cc671fbebdd1 (diff) |
Merge tag 'usb-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH:
"Here is a USB fix for the reported issue with commit 69bec7259853
("USB: core: let USB device know device node") as well as some other
issues that have been reported so far with this merge window"
* tag 'usb-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
USB: uas: Reduce can_queue to MAX_CMNDS
USB: cdc-acm: more sanity checking
USB: usb_driver_claim_interface: add sanity checking
usb/core: usb_alloc_dev(): fix setting of ->portnum
USB: iowarrior: fix oops with malicious USB descriptors
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/class/cdc-acm.c | 3 | ||||
-rw-r--r-- | drivers/usb/core/driver.c | 6 | ||||
-rw-r--r-- | drivers/usb/core/usb.c | 5 | ||||
-rw-r--r-- | drivers/usb/misc/iowarrior.c | 6 | ||||
-rw-r--r-- | drivers/usb/storage/uas.c | 2 |
5 files changed, 18 insertions, 4 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 1d2c99af2532..83fd30b0577c 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -1179,6 +1179,9 @@ static int acm_probe(struct usb_interface *intf, | |||
1179 | if (quirks == NO_UNION_NORMAL) { | 1179 | if (quirks == NO_UNION_NORMAL) { |
1180 | data_interface = usb_ifnum_to_if(usb_dev, 1); | 1180 | data_interface = usb_ifnum_to_if(usb_dev, 1); |
1181 | control_interface = usb_ifnum_to_if(usb_dev, 0); | 1181 | control_interface = usb_ifnum_to_if(usb_dev, 0); |
1182 | /* we would crash */ | ||
1183 | if (!data_interface || !control_interface) | ||
1184 | return -ENODEV; | ||
1182 | goto skip_normal_probe; | 1185 | goto skip_normal_probe; |
1183 | } | 1186 | } |
1184 | 1187 | ||
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 56593a9a8726..2057d91d8336 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -502,11 +502,15 @@ static int usb_unbind_interface(struct device *dev) | |||
502 | int usb_driver_claim_interface(struct usb_driver *driver, | 502 | int usb_driver_claim_interface(struct usb_driver *driver, |
503 | struct usb_interface *iface, void *priv) | 503 | struct usb_interface *iface, void *priv) |
504 | { | 504 | { |
505 | struct device *dev = &iface->dev; | 505 | struct device *dev; |
506 | struct usb_device *udev; | 506 | struct usb_device *udev; |
507 | int retval = 0; | 507 | int retval = 0; |
508 | int lpm_disable_error; | 508 | int lpm_disable_error; |
509 | 509 | ||
510 | if (!iface) | ||
511 | return -ENODEV; | ||
512 | |||
513 | dev = &iface->dev; | ||
510 | if (dev->driver) | 514 | if (dev->driver) |
511 | return -EBUSY; | 515 | return -EBUSY; |
512 | 516 | ||
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index ffa5cf13ffe1..dcb85e3cd5a7 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -424,6 +424,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, | |||
424 | struct usb_device *dev; | 424 | struct usb_device *dev; |
425 | struct usb_hcd *usb_hcd = bus_to_hcd(bus); | 425 | struct usb_hcd *usb_hcd = bus_to_hcd(bus); |
426 | unsigned root_hub = 0; | 426 | unsigned root_hub = 0; |
427 | unsigned raw_port = port1; | ||
427 | 428 | ||
428 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 429 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
429 | if (!dev) | 430 | if (!dev) |
@@ -498,11 +499,11 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, | |||
498 | 499 | ||
499 | if (!parent->parent) { | 500 | if (!parent->parent) { |
500 | /* device under root hub's port */ | 501 | /* device under root hub's port */ |
501 | port1 = usb_hcd_find_raw_port_number(usb_hcd, | 502 | raw_port = usb_hcd_find_raw_port_number(usb_hcd, |
502 | port1); | 503 | port1); |
503 | } | 504 | } |
504 | dev->dev.of_node = usb_of_get_child_node(parent->dev.of_node, | 505 | dev->dev.of_node = usb_of_get_child_node(parent->dev.of_node, |
505 | port1); | 506 | raw_port); |
506 | 507 | ||
507 | /* hub driver sets up TT records */ | 508 | /* hub driver sets up TT records */ |
508 | } | 509 | } |
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index c6bfd13f6c92..1950e87b4219 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c | |||
@@ -787,6 +787,12 @@ static int iowarrior_probe(struct usb_interface *interface, | |||
787 | iface_desc = interface->cur_altsetting; | 787 | iface_desc = interface->cur_altsetting; |
788 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); | 788 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); |
789 | 789 | ||
790 | if (iface_desc->desc.bNumEndpoints < 1) { | ||
791 | dev_err(&interface->dev, "Invalid number of endpoints\n"); | ||
792 | retval = -EINVAL; | ||
793 | goto error; | ||
794 | } | ||
795 | |||
790 | /* set up the endpoint information */ | 796 | /* set up the endpoint information */ |
791 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 797 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
792 | endpoint = &iface_desc->endpoint[i].desc; | 798 | endpoint = &iface_desc->endpoint[i].desc; |
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 44b096c1737b..13e4cc31bc79 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -836,7 +836,7 @@ static struct scsi_host_template uas_host_template = { | |||
836 | .slave_configure = uas_slave_configure, | 836 | .slave_configure = uas_slave_configure, |
837 | .eh_abort_handler = uas_eh_abort_handler, | 837 | .eh_abort_handler = uas_eh_abort_handler, |
838 | .eh_bus_reset_handler = uas_eh_bus_reset_handler, | 838 | .eh_bus_reset_handler = uas_eh_bus_reset_handler, |
839 | .can_queue = 65536, /* Is there a limit on the _host_ ? */ | 839 | .can_queue = MAX_CMNDS, |
840 | .this_id = -1, | 840 | .this_id = -1, |
841 | .sg_tablesize = SG_NONE, | 841 | .sg_tablesize = SG_NONE, |
842 | .skip_settle_delay = 1, | 842 | .skip_settle_delay = 1, |