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

Reply via email to