Skip to content

Commit

Permalink
USB: cdc-acm: fix failed open not being detected
Browse files Browse the repository at this point in the history
commit 8727bf6 upstream.

Fix errors during open not being returned to userspace. Specifically,
failed control-line manipulations or control or read urb submissions
would not be detected.

Fixes: 7fb57a0 ("USB: cdc-acm: Fix potential deadlock (lockdep
warning)")

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
  • Loading branch information
Johan Hovold authored and Jiri Slaby committed Mar 3, 2017
1 parent 0bb6506 commit e6b7fdc
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions drivers/usb/class/cdc-acm.c
Original file line number Diff line number Diff line change
@@ -514,17 +514,17 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
acm->control->needs_remote_wakeup = 1;

acm->ctrlurb->dev = acm->dev;
if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL);
if (retval) {
dev_err(&acm->control->dev,
"%s - usb_submit_urb(ctrl irq) failed\n", __func__);
goto error_submit_urb;
}

acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS;
if (acm_set_control(acm, acm->ctrlout) < 0 &&
(acm->ctrl_caps & USB_CDC_CAP_LINE)) {
retval = acm_set_control(acm, acm->ctrlout);
if (retval < 0 && (acm->ctrl_caps & USB_CDC_CAP_LINE))
goto error_set_control;
}

/*
* Unthrottle device in case the TTY was closed while throttled.
@@ -534,7 +534,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
acm->throttle_req = 0;
spin_unlock_irq(&acm->read_lock);

if (acm_submit_read_urbs(acm, GFP_KERNEL))
retval = acm_submit_read_urbs(acm, GFP_KERNEL);
if (retval)
goto error_submit_read_urbs;

usb_autopm_put_interface(acm->control);
@@ -555,7 +556,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
error_get_interface:
disconnected:
mutex_unlock(&acm->mutex);
return retval;

return usb_translate_errors(retval);
}

static void acm_port_destruct(struct tty_port *port)

0 comments on commit e6b7fdc

Please sign in to comment.