Skip to content

Commit

Permalink
tty: Fix leak in ti-usb
Browse files Browse the repository at this point in the history
If the ti-usb adapter returns an zero data length frame (which happens)
then we leak a kref.  Found by Christoph Mair <christoph.mair@gmail.com>
who proposed a patch.  The patch here is different as Christoph's patch
didn't work for the case where tty = NULL and data arrived but Christoph
did all the hard work chasing it down.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Alan-Cox authored and torvalds committed Apr 14, 2009
1 parent 7a9a65c commit cf54509
Showing 1 changed file with 14 additions and 12 deletions.
26 changes: 14 additions & 12 deletions drivers/usb/serial/ti_usb_3410_5052.c
Original file line number Diff line number Diff line change
Expand Up @@ -1215,20 +1215,22 @@ static void ti_bulk_in_callback(struct urb *urb)
}

tty = tty_port_tty_get(&port->port);
if (tty && urb->actual_length) {
usb_serial_debug_data(debug, dev, __func__,
urb->actual_length, urb->transfer_buffer);

if (!tport->tp_is_open)
dbg("%s - port closed, dropping data", __func__);
else
ti_recv(&urb->dev->dev, tty,
if (tty) {
if (urb->actual_length) {
usb_serial_debug_data(debug, dev, __func__,
urb->actual_length, urb->transfer_buffer);

if (!tport->tp_is_open)
dbg("%s - port closed, dropping data",
__func__);
else
ti_recv(&urb->dev->dev, tty,
urb->transfer_buffer,
urb->actual_length);

spin_lock(&tport->tp_lock);
tport->tp_icount.rx += urb->actual_length;
spin_unlock(&tport->tp_lock);
spin_lock(&tport->tp_lock);
tport->tp_icount.rx += urb->actual_length;
spin_unlock(&tport->tp_lock);
}
tty_kref_put(tty);
}

Expand Down

0 comments on commit cf54509

Please sign in to comment.