diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 56ce3a618b2..bb0efa5705e 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2355,8 +2355,15 @@ void exit_signals(struct task_struct *tsk)  	int group_stop = 0;  	sigset_t unblocked; +	/* +	 * @tsk is about to have PF_EXITING set - lock out users which +	 * expect stable threadgroup. +	 */ +	threadgroup_change_begin(tsk); +  	if (thread_group_empty(tsk) || signal_group_exit(tsk->signal)) {  		tsk->flags |= PF_EXITING; +		threadgroup_change_end(tsk);  		return;  	} @@ -2366,6 +2373,9 @@ void exit_signals(struct task_struct *tsk)  	 * see wants_signal(), do_signal_stop().  	 */  	tsk->flags |= PF_EXITING; + +	threadgroup_change_end(tsk); +  	if (!signal_pending(tsk))  		goto out;  |