Commit 80fe728d authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds

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: default avatarOleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7a5e873f
...@@ -892,7 +892,8 @@ specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t) ...@@ -892,7 +892,8 @@ specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
* since we do not want to have a signal handler that was blocked * since we do not want to have a signal handler that was blocked
* be invoked when user space had explicitly blocked it. * 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 int
force_sig_info(int sig, struct siginfo *info, struct task_struct *t) force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
...@@ -912,6 +913,8 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) ...@@ -912,6 +913,8 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
recalc_sigpending_and_wake(t); 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); ret = specific_send_sig_info(sig, info, t);
spin_unlock_irqrestore(&t->sighand->siglock, flags); spin_unlock_irqrestore(&t->sighand->siglock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment