diff --git a/[refs] b/[refs] index 3e6724f112aa..672b1f7df63b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6431e6a28e8df423e1ebcda065e9ff086198d2c6 +refs/heads/master: c33880aaddbbab1ccf36f4457ed1090621f2e39a diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c index 8f3debc77c5b..b3c24c732c5a 100644 --- a/trunk/kernel/signal.c +++ b/trunk/kernel/signal.c @@ -522,7 +522,16 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, { int sig = 0; - sig = next_signal(pending, mask); + /* SIGKILL must have priority, otherwise it is quite easy + * to create an unkillable process, sending sig < SIGKILL + * to self */ + if (unlikely(sigismember(&pending->signal, SIGKILL))) { + if (!sigismember(mask, SIGKILL)) + sig = SIGKILL; + } + + if (likely(!sig)) + sig = next_signal(pending, mask); if (sig) { if (current->notifier) { if (sigismember(current->notifier_mask, sig)) {