signals: allow the kernel to actually kill /sbin/init
PATCH 3/3 signals: allow the kernel to actually kill /sbin/init
Currently the buggy /sbin/init hangs if SIGSEGV/etc happens. The kernel sends the signal, init dequeues it and ignores, returns from the exception, repeats the faulting instruction, and so on forever.
Imho, such a behaviour is not good. I think that the explicit loud death of the buggy /sbin/init is better than the silent hang.
Change force_sig_info() to clear SIGNAL_UNKILLABLE when the task should be really killed.
Signed-off-by Oleg Nesterov <[email protected]>
kernel/signal.c renamed from kernel/signal.c~3_INIT_SIGSEGV +4 -1
@@ -877,7 +877,8 @@ specific_send_sig_info(int sig, struct s* since we do not want to have a signal handler that was blocked * be invoked when user space had explicitly blocked it. * -* We don't want to have recursive SIGSEGV's etc, for example. +* We don't want to have recursive SIGSEGV's etc, for example, +* that is why we also clear SIGNAL_UNKILLABLE. */ int force_sig_info (int sig,struct siginfo *info,struct task_struct *t)
@@ -897,6 +898,8 @@ force_sig_info(int sig, struct siginfo *recalc_sigpending_and_wake (t); } } +if (action->sa.sa_handler ==SIG_DFL ) + t->signal->flags &= ~SIGNAL_UNKILLABLE ; ret =specific_send_sig_info (sig, info, t);spin_unlock_irqrestore (&t->sighand->siglock, flags);