Skip to content

Commit

Permalink
USB: cdc-acm: fix possible deadlock with multiple openers
Browse files Browse the repository at this point in the history
The lock must be dropped before usb_autopm_interface_put() is called

Signed-off-by: Oliver Neukum <oliver@neukum.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Mar 2, 2010
1 parent d7e18a9 commit 2b626dc
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions drivers/usb/class/cdc-acm.c
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)

acm = acm_table[tty->index];
if (!acm || !acm->dev)
goto err_out;
goto out;
else
rv = 0;

Expand All @@ -569,8 +569,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)

mutex_lock(&acm->mutex);
if (acm->port.count++) {
mutex_unlock(&acm->mutex);
usb_autopm_put_interface(acm->control);
goto done;
goto out;
}

acm->ctrlurb->dev = acm->dev;
Expand Down Expand Up @@ -599,18 +600,18 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
set_bit(ASYNCB_INITIALIZED, &acm->port.flags);
rv = tty_port_block_til_ready(&acm->port, tty, filp);
tasklet_schedule(&acm->urb_task);
done:

mutex_unlock(&acm->mutex);
err_out:
out:
mutex_unlock(&open_mutex);
return rv;

full_bailout:
usb_kill_urb(acm->ctrlurb);
bail_out:
usb_autopm_put_interface(acm->control);
acm->port.count--;
mutex_unlock(&acm->mutex);
usb_autopm_put_interface(acm->control);
early_bail:
mutex_unlock(&open_mutex);
tty_port_tty_set(&acm->port, NULL);
Expand Down

0 comments on commit 2b626dc

Please sign in to comment.