Skip to content

Commit eb61b59

Browse files
jamieilestorvalds
authored andcommitted
signal: don't remove SIGNAL_UNKILLABLE for traced tasks.
When forcing a signal, SIGNAL_UNKILLABLE is removed to prevent recursive faults, but this is undesirable when tracing. For example, debugging an init process (whether global or namespace), hitting a breakpoint and SIGTRAP will force SIGTRAP and then remove SIGNAL_UNKILLABLE. Everything continues fine, but then once debugging has finished, the init process is left killable which is unlikely what the user expects, resulting in either an accidentally killed init or an init that stops reaping zombies. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Jamie Iles <[email protected]> Acked-by: Oleg Nesterov <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 6b31d59 commit eb61b59

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

kernel/signal.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,11 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
11941194
recalc_sigpending_and_wake(t);
11951195
}
11961196
}
1197-
if (action->sa.sa_handler == SIG_DFL)
1197+
/*
1198+
* Don't clear SIGNAL_UNKILLABLE for traced tasks, users won't expect
1199+
* debugging to leave init killable.
1200+
*/
1201+
if (action->sa.sa_handler == SIG_DFL && !t->ptrace)
11981202
t->signal->flags &= ~SIGNAL_UNKILLABLE;
11991203
ret = specific_send_sig_info(sig, info, t);
12001204
spin_unlock_irqrestore(&t->sighand->siglock, flags);

0 commit comments

Comments
 (0)