Hello, In linux 3.10 in the file drivers/tty/tty_port.c the function tty_port_tty_hangup may leak a tty reference:
struct tty_struct *tty = tty_port_tty_get(port); if (tty && (!check_clocal || !C_CLOCAL(tty))) { tty_hangup(tty); tty_kref_put(tty); } If tty != NULL and the second condition is false we never call tty_kref_put and the reference is leaked. Fix by nesting two if statements. Signed-off-by: Gianluca Anzolin <gianl...@sottospazio.it>
diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c index 121aeb9..2198f7d 100644 --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c @@ -256,8 +256,9 @@ void tty_port_tty_hangup(struct tty_port *port, bool check_clocal) { struct tty_struct *tty = tty_port_tty_get(port); - if (tty && (!check_clocal || !C_CLOCAL(tty))) { - tty_hangup(tty); + if (tty) { + if (!check_clocal || !C_CLOCAL(tty)) + tty_hangup(tty); tty_kref_put(tty); } }