|
@@ -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)) {
|