aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-03-18 19:19:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-03-18 19:19:15 -0400
commit040e3abbb958f5a038c16c1af7258e396303c2e1 (patch)
treee010c76f04d025599dd740faa83791cf482ff178 /drivers/usb
parentf7813ad5cbfd1fab2899914281b72a1ba0805c80 (diff)
parent55ff8cfbc4e12a7d2187df523938cc671fbebdd1 (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.c3
-rw-r--r--drivers/usb/core/driver.c6
-rw-r--r--drivers/usb/core/usb.c5
-rw-r--r--drivers/usb/misc/iowarrior.c6
-rw-r--r--drivers/usb/storage/uas.c2
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)
502int usb_driver_claim_interface(struct usb_driver *driver, 502int 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,