|
@@ -728,7 +728,8 @@ static void complete_signal(int sig, struct task_struct *p, int group)
|
|
|
* Found a killable thread. If the signal will be fatal,
|
|
|
* then start taking the whole group down immediately.
|
|
|
*/
|
|
|
- if (sig_fatal(p, sig) && !(signal->flags & SIGNAL_GROUP_EXIT) &&
|
|
|
+ if (sig_fatal(p, sig) &&
|
|
|
+ !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) &&
|
|
|
!sigismember(&t->real_blocked, sig) &&
|
|
|
(sig == SIGKILL || !(t->ptrace & PT_PTRACED))) {
|
|
|
/*
|
|
@@ -1615,7 +1616,8 @@ static int do_signal_stop(int signr)
|
|
|
} else {
|
|
|
struct task_struct *t;
|
|
|
|
|
|
- if (!likely(sig->flags & SIGNAL_STOP_DEQUEUED) ||
|
|
|
+ if (unlikely((sig->flags & (SIGNAL_STOP_DEQUEUED | SIGNAL_UNKILLABLE))
|
|
|
+ != SIGNAL_STOP_DEQUEUED) ||
|
|
|
unlikely(signal_group_exit(sig)))
|
|
|
return 0;
|
|
|
/*
|
|
@@ -1761,7 +1763,8 @@ relock:
|
|
|
/*
|
|
|
* Global init gets no signals it doesn't want.
|
|
|
*/
|
|
|
- if (is_global_init(current))
|
|
|
+ if (unlikely(signal->flags & SIGNAL_UNKILLABLE) &&
|
|
|
+ !signal_group_exit(signal))
|
|
|
continue;
|
|
|
|
|
|
if (sig_kernel_stop(signr)) {
|