aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-03-18 14:45:44 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-18 16:40:06 -0400
commitd9c1e9a8fff512bb6c43461181d4360f1c8cfd6d (patch)
treed77f4e779065c7d52a6b17cca5fb1a23fac505a7
parentaeb3f6d10ebfd5607f4bd3920b3b730a992ab82c (diff)
[PATCH] tty: Fix two reported pid leaks
These leaks were reported by: Catalin Marinas <catalin.marians@gmail.com> and I have been able to very by inspection they are possible. When converting tty_io.c to store pids as struct pid pointers instead of pid_t values it appears I overlooked two places where we stop using the pid value. The very obvious one is in do_tty_hangup, and the one the less obvious one in __proc_set_tty. When looking into the code __proc_set_tty only has pids that need to be put because of failures of other parts of the code to properly perform hangup processing. Fixing the leak here in __proc_set_tty is easy and obviously correct so I am doing that first. Fixing the places that should be performing hangup processing is much less obviously correct. So those I'm aiming those patches at -mm. for now, so the can age a while before they are merged. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/char/tty_io.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index e45326856680..7a32df594907 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -1376,6 +1376,8 @@ static void do_tty_hangup(struct work_struct *work)
1376 read_unlock(&tasklist_lock); 1376 read_unlock(&tasklist_lock);
1377 1377
1378 tty->flags = 0; 1378 tty->flags = 0;
1379 put_pid(tty->session);
1380 put_pid(tty->pgrp);
1379 tty->session = NULL; 1381 tty->session = NULL;
1380 tty->pgrp = NULL; 1382 tty->pgrp = NULL;
1381 tty->ctrl_status = 0; 1383 tty->ctrl_status = 0;
@@ -3841,6 +3843,9 @@ static struct pid *__proc_set_tty(struct task_struct *tsk, struct tty_struct *tt
3841{ 3843{
3842 struct pid *old_pgrp; 3844 struct pid *old_pgrp;
3843 if (tty) { 3845 if (tty) {
3846 /* We should not have a session or pgrp to here but.... */
3847 put_pid(tty->session);
3848 put_pid(tty->pgrp);
3844 tty->session = get_pid(task_session(tsk)); 3849 tty->session = get_pid(task_session(tsk));
3845 tty->pgrp = get_pid(task_pgrp(tsk)); 3850 tty->pgrp = get_pid(task_pgrp(tsk));
3846 } 3851 }