Patch "kernel/signal.c: protect the traced SIGNAL_UNKILLABLE tasks from SIGKILL" has been added to the 4.4-stable tree
This is a note to let you know that I've just added the patch titled
kernel/signal.c: protect the traced SIGNAL_UNKILLABLE tasks from SIGKILL
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kernel-signal.c-protect-the-traced-signal_unkillable-tasks-from-sigkill.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
628c1bcba204052d19b686b5bac149a644cdb72eMon Sep 17 00:00:00 2001
From: Oleg Nesterov <[email protected]>
Date: Fri, 17 Nov 2017 15:30:01 -0800
Subject: kernel/signal.c: protect the traced SIGNAL_UNKILLABLE tasks from SIGKILL
From: Oleg Nesterov <[email protected]>
commit 628c1bcba204052d19b686b5bac149a644cdb72e upstream.
The comment in sig_ignored() says "Tracers may want to know about even ignored signals" but SIGKILL can not be reported to debugger and it is just wrong to return 0 in this case: SIGKILL should only kill the SIGNAL_UNKILLABLE task if it comes from the parent ns.
Change sig_ignored() to ignore ->ptrace if sig == SIGKILL and rely on sig_task_ignored().
SISGTOP coming from within the namespace is not really right too but at least debugger can intercept it, and we can't drop it here because this will break "gdb -p 1": ptrace_attach() won't work. Perhaps we will add another ->ptrace check later, we will see.
--- kernel/signal.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
kernel/signal.c +7 -5
@@ -88,13 +88,15 @@ static int sig_ignored(struct task_strucif (sigismember (&t->blocked, sig) ||sigismember (&t->real_blocked, sig))return 0 ; -if (!sig_task_ignored (t, sig, force)) -return 0 ; -/* -* Tracers may want to know about even ignored signals. +* Tracers may want to know about even ignored signal unless it +* is SIGKILL which can't be reported anyway but can be ignored +* by SIGNAL_UNKILLABLE task. */ -return !t->ptrace; +if (t->ptrace && sig !=SIGKILL ) +return 0 ; + +return sig_task_ignored (t, sig, force); }/*
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/kernel-signal.c-remove-the-no-longer-needed-signal_unkillable-check-in-complete_signal.patch queue-4.4/kernel-signal.c-protect-the-signal_unkillable-tasks-from-sig_kernel_only-signals.patch queue-4.4/x86-kasan-write-protect-kasan-zero-shadow.patch queue-4.4/kernel-acct.c-fix-the-acct-needcheck-check-in-check_free_space.patch queue-4.4/kernel-signal.c-protect-the-traced-signal_unkillable-tasks-from-sigkill.patch