[PATCH] tty: clarify disassociate_ctty
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 12 Feb 2007 08:52:52 +0000 (00:52 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 12 Feb 2007 17:48:31 +0000 (09:48 -0800)
The code to look at tty_old_pgrp and send SIGHUP and SIGCONT when it is
present only executes when disassociate_ctty is called from do_exit.  Make
this clear by adding an explict on_exit check, and explicitly setting
tty_old_pgrp to 0.

In addition fix the locking by reading tty_old_pgrp under the siglock.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/tty_io.c

index b9fce77c8f032ce0f7af9803eee6d9f6ba20e79d..ac937f767f23c9aa0f70be42156e72feb29d9a9e 100644 (file)
@@ -1508,8 +1508,12 @@ void disassociate_ctty(int on_exit)
                /* XXX: here we race, there is nothing protecting tty */
                if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
                        tty_vhangup(tty);
-       } else {
-               pid_t old_pgrp = current->signal->tty_old_pgrp;
+       } else if (on_exit) {
+               pid_t old_pgrp;
+               spin_lock_irq(&current->sighand->siglock);
+               old_pgrp = current->signal->tty_old_pgrp;
+               current->signal->tty_old_pgrp = 0;
+               spin_unlock_irq(&current->sighand->siglock);
                if (old_pgrp) {
                        kill_pg(old_pgrp, SIGHUP, on_exit);
                        kill_pg(old_pgrp, SIGCONT, on_exit);