Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

tty: Fix USB kref leak

The sysrq code acquired a kref leak. Fix it by passing the tty separately
from the caller (thus effectively using the callers kref which all the
callers hold anyway)

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alan Cox and committed by
Linus Torvalds
24a15a62 4cd1de0a

+8 -6
+1 -1
drivers/usb/serial/ftdi_sio.c
··· 2121 2121 /* Note that the error flag is duplicated for 2122 2122 every character received since we don't know 2123 2123 which character it applied to */ 2124 - if (!usb_serial_handle_sysrq_char(port, 2124 + if (!usb_serial_handle_sysrq_char(tty, port, 2125 2125 data[packet_offset + i])) 2126 2126 tty_insert_flip_char(tty, 2127 2127 data[packet_offset + i],
+4 -3
drivers/usb/serial/generic.c
··· 432 432 else { 433 433 /* Push data to tty */ 434 434 for (i = 0; i < urb->actual_length; i++, ch++) { 435 - if (!usb_serial_handle_sysrq_char(port, *ch)) 435 + if (!usb_serial_handle_sysrq_char(tty, port, *ch)) 436 436 tty_insert_flip_char(tty, *ch, TTY_NORMAL); 437 437 } 438 438 } ··· 534 534 } 535 535 } 536 536 537 - int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch) 537 + int usb_serial_handle_sysrq_char(struct tty_struct *tty, 538 + struct usb_serial_port *port, unsigned int ch) 538 539 { 539 540 if (port->sysrq && port->console) { 540 541 if (ch && time_before(jiffies, port->sysrq)) { 541 - handle_sysrq(ch, tty_port_tty_get(&port->port)); 542 + handle_sysrq(ch, tty); 542 543 port->sysrq = 0; 543 544 return 1; 544 545 }
+1 -1
drivers/usb/serial/pl2303.c
··· 1038 1038 if (line_status & UART_OVERRUN_ERROR) 1039 1039 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 1040 1040 for (i = 0; i < urb->actual_length; ++i) 1041 - if (!usb_serial_handle_sysrq_char(port, data[i])) 1041 + if (!usb_serial_handle_sysrq_char(tty, port, data[i])) 1042 1042 tty_insert_flip_char(tty, data[i], tty_flag); 1043 1043 tty_flip_buffer_push(tty); 1044 1044 }
+2 -1
include/linux/usb/serial.h
··· 317 317 extern void usb_serial_generic_deregister(void); 318 318 extern void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port, 319 319 gfp_t mem_flags); 320 - extern int usb_serial_handle_sysrq_char(struct usb_serial_port *port, 320 + extern int usb_serial_handle_sysrq_char(struct tty_struct *tty, 321 + struct usb_serial_port *port, 321 322 unsigned int ch); 322 323 extern int usb_serial_handle_break(struct usb_serial_port *port); 323 324