In prepartion for moving the work of sys_exit and sys_group_exit into get_signal compute exit_code in get_signal, make PF_SIGNALED depend on the exit_code and pass the exit_code to do_group_exit. Anytime there is a group exit the exit_code may differ from the signal number. To match the historical precedent as best I can make the exit_code 0 during exec. (The exit_code field would not have been set but probably would have been left at a value of 0). Signed-off-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> --- kernel/signal.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c index fd3c404de8b6..2a24cca00ca1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2707,6 +2707,7 @@ bool get_signal(struct ksignal *ksig) for (;;) { struct k_sigaction *ka; enum pid_type type; + int exit_code; /* Has this task already been marked for death? */ if ((signal->flags & SIGNAL_GROUP_EXIT) || @@ -2716,6 +2717,10 @@ bool get_signal(struct ksignal *ksig) trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO, &sighand->action[SIGKILL - 1]); recalc_sigpending(); + if (signal->flags & SIGNAL_GROUP_EXIT) + exit_code = signal->group_exit_code; + else + exit_code = 0; goto fatal; } @@ -2837,15 +2842,17 @@ bool get_signal(struct ksignal *ksig) continue; } + /* + * Anything else is fatal, maybe with a core dump. + */ + exit_code = signr; fatal: spin_unlock_irq(&sighand->siglock); if (unlikely(cgroup_task_frozen(current))) cgroup_leave_frozen(true); - /* - * Anything else is fatal, maybe with a core dump. - */ - current->flags |= PF_SIGNALED; + if (exit_code & 0x7f) + current->flags |= PF_SIGNALED; if (sig_kernel_coredump(signr)) { if (print_fatal_signals) @@ -2873,7 +2880,7 @@ bool get_signal(struct ksignal *ksig) /* * Death signals, no core dump. */ - do_group_exit(ksig->info.si_signo); + do_group_exit(exit_code); /* NOTREACHED */ } spin_unlock_irq(&sighand->siglock); -- 2.29.2