All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/3] clear signal->tty when the last thread exits
@ 2010-03-19 18:40 Oleg Nesterov
  2010-03-24 14:23 ` [PATCH -mm] signals-clear-signal-tty-when-the-last-thread-exits.fix Oleg Nesterov
  2010-04-08  2:20 ` [PATCH 2/3] clear signal->tty when the last thread exits Roland McGrath
  0 siblings, 2 replies; 6+ messages in thread
From: Oleg Nesterov @ 2010-03-19 18:40 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Alan Cox, Ingo Molnar, Peter Zijlstra, Roland McGrath,
	linux-kernel

When the last thread exits signal->tty is freed, but the pointer is not
cleared and points to nowhere.

This is OK. Nobody should use signal->tty lockless, and it is no longer
possible to take ->siglock. However this looks wrong even if correct, and
the nice OOPS is better than subtle and hard to find bugs.

Change __exit_signal() to clear signal->tty under ->siglock.

Note: __exit_signal() needs more cleanups. It should not check "sig != NULL"
to detect the all-dead case and we have the same issues with signal->stats.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---

 kernel/exit.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- 34-rc1/kernel/exit.c~9_CLEAR_SIGNAL_TTY	2010-03-19 17:25:36.000000000 +0100
+++ 34-rc1/kernel/exit.c	2010-03-19 18:55:02.000000000 +0100
@@ -81,6 +81,7 @@ static void __exit_signal(struct task_st
 {
 	struct signal_struct *sig = tsk->signal;
 	struct sighand_struct *sighand;
+	struct tty_struct *tty;
 
 	BUG_ON(!sig);
 	BUG_ON(!atomic_read(&sig->count));
@@ -94,6 +95,8 @@ static void __exit_signal(struct task_st
 	posix_cpu_timers_exit(tsk);
 	if (thread_group_leader(tsk)) {
 		posix_cpu_timers_exit_group(tsk);
+		tty = sig->tty;
+		sig->tty = NULL;
 	} else {
 		/*
 		 * If there is any task waiting for the group exit
@@ -148,7 +151,7 @@ static void __exit_signal(struct task_st
 		 * see account_group_exec_runtime().
 		 */
 		task_rq_unlock_wait(tsk);
-		tty_kref_put(sig->tty);
+		tty_kref_put(tty);
 	}
 }
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-04-08  2:21 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-19 18:40 [PATCH 2/3] clear signal->tty when the last thread exits Oleg Nesterov
2010-03-24 14:23 ` [PATCH -mm] signals-clear-signal-tty-when-the-last-thread-exits.fix Oleg Nesterov
2010-03-24 11:41   ` Andrew Morton
2010-03-24 16:02     ` Oleg Nesterov
2010-03-24 16:42       ` Oleg Nesterov
2010-04-08  2:20 ` [PATCH 2/3] clear signal->tty when the last thread exits Roland McGrath

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.