[PATCH] Fix refcount leak in tty_port.c

From: Gianluca Anzolin
Date: Tue Jul 09 2013 - 04:41:11 EST


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 <gianluca@xxxxxxxxxxxxxx>
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);
}
}