diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 1510f78a0ff..8f6185e69b6 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -126,6 +126,12 @@ static void __exit_signal(struct task_struct *tsk)  	__unhash_process(tsk); +	/* +	 * Do this under ->siglock, we can race with another thread +	 * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. +	 */ +	flush_sigqueue(&tsk->pending); +  	tsk->signal = NULL;  	tsk->sighand = NULL;  	spin_unlock(&sighand->siglock); @@ -133,7 +139,6 @@ static void __exit_signal(struct task_struct *tsk)  	__cleanup_sighand(sighand);  	clear_tsk_thread_flag(tsk,TIF_SIGPENDING); -	flush_sigqueue(&tsk->pending);  	if (sig) {  		flush_sigqueue(&sig->shared_pending);  		taskstats_tgid_free(sig);  | 
