On Wed, May 04, 2005 at 10:21:09AM -0300, Flavio Leitner wrote:
> 
> Hello,
> 
> I'm testing with pl2303 but oops show at serial_open() then 
> I don't know if happens with other modules too. The program 
> that trigger bug is attached below and just open(), tcsetattr() 
> and close().

I think we found the race condition:

Process 1 = P1
Process 2 = P2

P1:              
serial_open()
 ++open_count  -----------> = 1 
 if (open_count == 1)
        tty->driver_data = port
        port->tty = tty;
        pl2303_open()

serial_close()
 --open_count ------------> = 0
 if (open_count == 0)
        pl2303_close()
         schedule_timeout()

P1 is sleeping here waitting buffers be drained and gives the opportunity 
for P2 open device too.
P2:
serial_open()
 ++open_count   ----------> = 1
 if (open_count == 1)
        tty->driver_data = port
        port->tty = tty;
        pl2303_open()
return Ok!

P2 is stopped here and gives a chance of P1 continue and here is a problem 
when P1 cames back to serial_close():
  port->tty->driver_data = NULL;
  port->tty = NULL;

Now we have open_count = 1 and port->tty = NULL and P2 with 
a valid file descriptor. If P2 do ioctl() kernel will oopses here:

struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;

Any suggestion how to solve it?

-- 
Flávio Bruno Leitner <[EMAIL PROTECTED]>
[0EA2 7F40 4CF4 1E63 4AF6  33C0 3E10 E205 F251 EDDA]


-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.
Get your fingers limbered up and give it your best shot. 4 great events, 4
opportunities to win big! Highest score wins.NEC IT Guy Games. Play to
win an NEC 61 plasma display. Visit http://www.necitguy.com/?r 
_______________________________________________
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