ChangeSet 1.2045, 2005/02/03 01:39:00-08:00, [EMAIL PROTECTED] [PATCH] USB: fix for open/disconnect race in acm
open takes the semaphore too late. This fixes it. Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]> Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> drivers/usb/class/cdc-acm.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-) diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c 2005-02-03 08:45:05 -08:00 +++ b/drivers/usb/class/cdc-acm.c 2005-02-03 08:45:05 -08:00 @@ -261,16 +261,22 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) { - struct acm *acm = acm_table[tty->index]; + struct acm *acm; + int rv = -EINVAL; dbg("Entering acm_tty_open.\n"); + + down(&open_sem); + acm = acm_table[tty->index]; if (!acm || !acm->dev) - return -EINVAL; + goto err_out; + else + rv = 0; tty->driver_data = acm; acm->tty = tty; - down(&open_sem); + if (acm->used) { goto done; @@ -279,7 +285,8 @@ acm->ctrlurb->dev = acm->dev; if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { dbg("usb_submit_urb(ctrl irq) failed"); - goto bail_out; + rv = -EIO; + goto err_out; } acm->readurb->dev = acm->dev; @@ -297,14 +304,14 @@ done: acm->used++; +err_out: up(&open_sem); - return 0; + return rv; full_bailout: usb_kill_urb(acm->readurb); bail_out_and_unlink: usb_kill_urb(acm->ctrlurb); -bail_out: up(&open_sem); return -EIO; } ------------------------------------------------------- This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting Tool for open source databases. Create drag-&-drop reports. Save time by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. Download a FREE copy at http://www.intelliview.com/go/osdn_nl _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel