diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-22 15:45:55 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-22 15:45:55 -0400 |
| commit | 8f46c507a2245697d6b3af75552c76d2f4fb3ed2 (patch) | |
| tree | 2d3372ae90c6dd549e4b664a65826770a5edf450 | |
| parent | 70dc52faae971cb7cfd6b0d3a5824886bb5045bb (diff) | |
| parent | fc98ab873aa3dbe783ce56a2ffdbbe7c7609521a (diff) | |
Merge tag 'usb-3.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg Kroah-Hartman:
"Here are a number of USB fixes that resolve issues that have been
reported against 3.9-rc3."
* tag 'usb-3.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (37 commits)
USB: ti_usb_3410_5052: fix use-after-free in TIOCMIWAIT
USB: ssu100: fix use-after-free in TIOCMIWAIT
USB: spcp8x5: fix use-after-free in TIOCMIWAIT
USB: quatech2: fix use-after-free in TIOCMIWAIT
USB: pl2303: fix use-after-free in TIOCMIWAIT
USB: oti6858: fix use-after-free in TIOCMIWAIT
USB: mos7840: fix use-after-free in TIOCMIWAIT
USB: mos7840: fix broken TIOCMIWAIT
USB: mct_u232: fix use-after-free in TIOCMIWAIT
USB: io_ti: fix use-after-free in TIOCMIWAIT
USB: io_edgeport: fix use-after-free in TIOCMIWAIT
USB: ftdi_sio: fix use-after-free in TIOCMIWAIT
USB: f81232: fix use-after-free in TIOCMIWAIT
USB: cypress_m8: fix use-after-free in TIOCMIWAIT
USB: ch341: fix use-after-free in TIOCMIWAIT
USB: ark3116: fix use-after-free in TIOCMIWAIT
USB: serial: add modem-status-change wait queue
USB: serial: fix interface refcounting
USB: io_ti: fix get_icount for two port adapters
USB: garmin_gps: fix memory leak on disconnect
...
36 files changed, 202 insertions, 115 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 8ac25adf31b4..387dc6c8ad25 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -593,7 +593,6 @@ static void acm_port_destruct(struct tty_port *port) | |||
| 593 | 593 | ||
| 594 | dev_dbg(&acm->control->dev, "%s\n", __func__); | 594 | dev_dbg(&acm->control->dev, "%s\n", __func__); |
| 595 | 595 | ||
| 596 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
| 597 | acm_release_minor(acm); | 596 | acm_release_minor(acm); |
| 598 | usb_put_intf(acm->control); | 597 | usb_put_intf(acm->control); |
| 599 | kfree(acm->country_codes); | 598 | kfree(acm->country_codes); |
| @@ -977,6 +976,8 @@ static int acm_probe(struct usb_interface *intf, | |||
| 977 | int num_rx_buf; | 976 | int num_rx_buf; |
| 978 | int i; | 977 | int i; |
| 979 | int combined_interfaces = 0; | 978 | int combined_interfaces = 0; |
| 979 | struct device *tty_dev; | ||
| 980 | int rv = -ENOMEM; | ||
| 980 | 981 | ||
| 981 | /* normal quirks */ | 982 | /* normal quirks */ |
| 982 | quirks = (unsigned long)id->driver_info; | 983 | quirks = (unsigned long)id->driver_info; |
| @@ -1339,11 +1340,24 @@ skip_countries: | |||
| 1339 | usb_set_intfdata(data_interface, acm); | 1340 | usb_set_intfdata(data_interface, acm); |
| 1340 | 1341 | ||
| 1341 | usb_get_intf(control_interface); | 1342 | usb_get_intf(control_interface); |
| 1342 | tty_port_register_device(&acm->port, acm_tty_driver, minor, | 1343 | tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, |
| 1343 | &control_interface->dev); | 1344 | &control_interface->dev); |
| 1345 | if (IS_ERR(tty_dev)) { | ||
| 1346 | rv = PTR_ERR(tty_dev); | ||
| 1347 | goto alloc_fail8; | ||
| 1348 | } | ||
| 1344 | 1349 | ||
| 1345 | return 0; | 1350 | return 0; |
| 1351 | alloc_fail8: | ||
| 1352 | if (acm->country_codes) { | ||
| 1353 | device_remove_file(&acm->control->dev, | ||
| 1354 | &dev_attr_wCountryCodes); | ||
| 1355 | device_remove_file(&acm->control->dev, | ||
| 1356 | &dev_attr_iCountryCodeRelDate); | ||
| 1357 | } | ||
| 1358 | device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); | ||
| 1346 | alloc_fail7: | 1359 | alloc_fail7: |
| 1360 | usb_set_intfdata(intf, NULL); | ||
| 1347 | for (i = 0; i < ACM_NW; i++) | 1361 | for (i = 0; i < ACM_NW; i++) |
| 1348 | usb_free_urb(acm->wb[i].urb); | 1362 | usb_free_urb(acm->wb[i].urb); |
| 1349 | alloc_fail6: | 1363 | alloc_fail6: |
| @@ -1359,7 +1373,7 @@ alloc_fail2: | |||
| 1359 | acm_release_minor(acm); | 1373 | acm_release_minor(acm); |
| 1360 | kfree(acm); | 1374 | kfree(acm); |
| 1361 | alloc_fail: | 1375 | alloc_fail: |
| 1362 | return -ENOMEM; | 1376 | return rv; |
| 1363 | } | 1377 | } |
| 1364 | 1378 | ||
| 1365 | static void stop_data_traffic(struct acm *acm) | 1379 | static void stop_data_traffic(struct acm *acm) |
| @@ -1411,6 +1425,8 @@ static void acm_disconnect(struct usb_interface *intf) | |||
| 1411 | 1425 | ||
| 1412 | stop_data_traffic(acm); | 1426 | stop_data_traffic(acm); |
| 1413 | 1427 | ||
| 1428 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
| 1429 | |||
| 1414 | usb_free_urb(acm->ctrlurb); | 1430 | usb_free_urb(acm->ctrlurb); |
| 1415 | for (i = 0; i < ACM_NW; i++) | 1431 | for (i = 0; i < ACM_NW; i++) |
| 1416 | usb_free_urb(acm->wb[i].urb); | 1432 | usb_free_urb(acm->wb[i].urb); |
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 622b4a48e732..2b487d4797bd 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -173,6 +173,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 173 | struct hc_driver *driver; | 173 | struct hc_driver *driver; |
| 174 | struct usb_hcd *hcd; | 174 | struct usb_hcd *hcd; |
| 175 | int retval; | 175 | int retval; |
| 176 | int hcd_irq = 0; | ||
| 176 | 177 | ||
| 177 | if (usb_disabled()) | 178 | if (usb_disabled()) |
| 178 | return -ENODEV; | 179 | return -ENODEV; |
| @@ -187,15 +188,19 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 187 | return -ENODEV; | 188 | return -ENODEV; |
| 188 | dev->current_state = PCI_D0; | 189 | dev->current_state = PCI_D0; |
| 189 | 190 | ||
| 190 | /* The xHCI driver supports MSI and MSI-X, | 191 | /* |
| 191 | * so don't fail if the BIOS doesn't provide a legacy IRQ. | 192 | * The xHCI driver has its own irq management |
| 193 | * make sure irq setup is not touched for xhci in generic hcd code | ||
| 192 | */ | 194 | */ |
| 193 | if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) { | 195 | if ((driver->flags & HCD_MASK) != HCD_USB3) { |
| 194 | dev_err(&dev->dev, | 196 | if (!dev->irq) { |
| 195 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", | 197 | dev_err(&dev->dev, |
| 196 | pci_name(dev)); | 198 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", |
| 197 | retval = -ENODEV; | 199 | pci_name(dev)); |
| 198 | goto disable_pci; | 200 | retval = -ENODEV; |
| 201 | goto disable_pci; | ||
| 202 | } | ||
| 203 | hcd_irq = dev->irq; | ||
| 199 | } | 204 | } |
| 200 | 205 | ||
| 201 | hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); | 206 | hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); |
| @@ -245,7 +250,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 245 | 250 | ||
| 246 | pci_set_master(dev); | 251 | pci_set_master(dev); |
| 247 | 252 | ||
| 248 | retval = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); | 253 | retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED); |
| 249 | if (retval != 0) | 254 | if (retval != 0) |
| 250 | goto unmap_registers; | 255 | goto unmap_registers; |
| 251 | set_hs_companion(dev, hcd); | 256 | set_hs_companion(dev, hcd); |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 71beeb833558..cc9c49c57c80 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -447,14 +447,13 @@ static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req) | |||
| 447 | static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req) | 447 | static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req) |
| 448 | { | 448 | { |
| 449 | struct f_rndis *rndis = req->context; | 449 | struct f_rndis *rndis = req->context; |
| 450 | struct usb_composite_dev *cdev = rndis->port.func.config->cdev; | ||
| 451 | int status; | 450 | int status; |
| 452 | 451 | ||
| 453 | /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ | 452 | /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ |
| 454 | // spin_lock(&dev->lock); | 453 | // spin_lock(&dev->lock); |
| 455 | status = rndis_msg_parser(rndis->config, (u8 *) req->buf); | 454 | status = rndis_msg_parser(rndis->config, (u8 *) req->buf); |
| 456 | if (status < 0) | ||
