diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 4 | ||||
| -rw-r--r-- | kernel/signal.c | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index e0df301a4553..3171228f25c3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -747,7 +747,9 @@ static void exit_notify(struct task_struct *tsk) } state = EXIT_ZOMBIE; - if (tsk->exit_signal == -1 && tsk->ptrace == 0) + if (tsk->exit_signal == -1 && + (likely(tsk->ptrace == 0) || + unlikely(tsk->parent->signal->flags & SIGNAL_GROUP_EXIT))) state = EXIT_DEAD; tsk->exit_state = state; diff --git a/kernel/signal.c b/kernel/signal.c index 6d0a3bd948ab..d98e9624ea30 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1588,7 +1588,9 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) read_lock(&tasklist_lock); if (likely(current->ptrace & PT_PTRACED) && likely(current->parent != current->real_parent || - !(current->ptrace & PT_ATTACHED))) { + !(current->ptrace & PT_ATTACHED)) && + (likely(current->parent->signal != current->signal) || + !unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) { do_notify_parent_cldstop(current, current->parent, CLD_TRAPPED); read_unlock(&tasklist_lock); |
