aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 5d50ea899b6d..4a548c6a4118 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -72,7 +72,7 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force)
72 handler = sig_handler(t, sig); 72 handler = sig_handler(t, sig);
73 73
74 if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) && 74 if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
75 handler == SIG_DFL && !force) 75 handler == SIG_DFL && !(force && sig_kernel_only(sig)))
76 return 1; 76 return 1;
77 77
78 return sig_handler_ignored(handler, sig); 78 return sig_handler_ignored(handler, sig);
@@ -88,13 +88,15 @@ static int sig_ignored(struct task_struct *t, int sig, bool force)
88 if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig)) 88 if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
89 return 0; 89 return 0;
90 90
91 if (!sig_task_ignored(t, sig, force))
92 return 0;
93
94 /* 91 /*
95 * Tracers may want to know about even ignored signals. 92 * Tracers may want to know about even ignored signal unless it
93 * is SIGKILL which can't be reported anyway but can be ignored
94 * by SIGNAL_UNKILLABLE task.
96 */ 95 */
97 return !t->ptrace; 96 if (t->ptrace && sig != SIGKILL)
97 return 0;
98
99 return sig_task_ignored(t, sig, force);
98} 100}
99 101
100/* 102/*
@@ -917,9 +919,9 @@ static void complete_signal(int sig, struct task_struct *p, int group)
917 * then start taking the whole group down immediately. 919 * then start taking the whole group down immediately.
918 */ 920 */
919 if (sig_fatal(p, sig) && 921 if (sig_fatal(p, sig) &&
920 !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) && 922 !(signal->flags & SIGNAL_GROUP_EXIT) &&
921 !sigismember(&t->real_blocked, sig) && 923 !sigismember(&t->real_blocked, sig) &&
922 (sig == SIGKILL || !t->ptrace)) { 924 (sig == SIGKILL || !p->ptrace)) {
923 /* 925 /*
924 * This signal will be fatal to the whole group. 926 * This signal will be fatal to the whole group.
925 */ 927 */