aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Korotaev <dev@sw.ru>2005-05-24 19:29:47 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-24 20:08:13 -0700
commitc33880aaddbbab1ccf36f4457ed1090621f2e39a (patch)
tree2bcaa297c0688c3ce997ede15bf224c39fee6e23
parent6431e6a28e8df423e1ebcda065e9ff086198d2c6 (diff)
downloadlinux-c33880aaddbbab1ccf36f4457ed1090621f2e39a.tar.gz
[PATCH] sigkill priority fix
If SIGKILL does not have priority, we cannot instantly kill task before it makes some unexpected job. It can be critical, but we were unable to reproduce this easily until Heiko Carstens <Heiko.Carstens@de.ibm.com> reported this problem on LKML. Signed-Off-By: Kirill Korotaev <dev@sw.ru> Signed-Off-By: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--kernel/signal.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 8f3debc77c5..b3c24c732c5 100644
--- a/kernel/signal.c
+++ b/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)) {