Skip to content

Commit 9a95f78

Browse files
committed
signal: Drop signals received after a fatal signal has been processed
In 403bad7 ("coredump: only SIGKILL should interrupt the coredumping task") Oleg modified the kernel to drop all signals that come in during a coredump except SIGKILL, and suggested that it might be a good idea to generalize that to other cases after the process has received a fatal signal. Semantically it does not make sense to perform any signal delivery after the process has already been killed. When a signal is sent while a process is dying today the signal is placed in the signal queue by __send_signal and a single task of the process is woken up with signal_wake_up, if there are any tasks that have not set PF_EXITING. Take things one step farther and have prepare_signal report that all signals that come after a process has been killed should be ignored. While retaining the historical exception of allowing SIGKILL to interrupt coredumps. Update the comment in fs/coredump.c to make it clear coredumps are special in being able to receive SIGKILL. This changes things so that a process stopped in PTRACE_EVENT_EXIT can not be made to escape it's ptracer and finish exiting by sending it SIGKILL. That a process can be made to leave PTRACE_EVENT_EXIT and escape it's tracer by sending the process a SIGKILL has been complicating tracer's for no apparent advantage. If the process needs to be made to leave PTRACE_EVENT_EXIT all that needs to happen is to kill the proceses's tracer. This differs from the coredump code where there is no other mechanism besides honoring SIGKILL to expedite the end of coredumping. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: "Eric W. Biederman" <[email protected]>
1 parent d80f7d7 commit 9a95f78

File tree

2 files changed

+3
-2
lines changed

2 files changed

+3
-2
lines changed

fs/coredump.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ static int zap_process(struct task_struct *start, int exit_code)
354354
struct task_struct *t;
355355
int nr = 0;
356356

357-
/* ignore all signals except SIGKILL, see prepare_signal() */
357+
/* Allow SIGKILL, see prepare_signal() */
358358
start->signal->flags = SIGNAL_GROUP_EXIT;
359359
start->signal->group_exit_code = exit_code;
360360
start->signal->group_stop_count = 0;

kernel/signal.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,8 +913,9 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force)
913913
if (signal->core_state)
914914
return sig == SIGKILL;
915915
/*
916-
* The process is in the middle of dying, nothing to do.
916+
* The process is in the middle of dying, drop the signal.
917917
*/
918+
return false;
918919
} else if (sig_kernel_stop(sig)) {
919920
/*
920921
* This is a stop signal. Remove SIGCONT from all queues.

0 commit comments

Comments
 (0)