diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 9efd1cee6d0b..1a942ce32ba0 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -300,12 +300,12 @@ flush_signal_handlers(struct task_struct *t, int force_default) | |||
300 | 300 | ||
301 | int unhandled_signal(struct task_struct *tsk, int sig) | 301 | int unhandled_signal(struct task_struct *tsk, int sig) |
302 | { | 302 | { |
303 | void __user *handler = tsk->sighand->action[sig-1].sa.sa_handler; | ||
303 | if (is_global_init(tsk)) | 304 | if (is_global_init(tsk)) |
304 | return 1; | 305 | return 1; |
305 | if (tsk->ptrace & PT_PTRACED) | 306 | if (handler != SIG_IGN && handler != SIG_DFL) |
306 | return 0; | 307 | return 0; |
307 | return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) || | 308 | return !tracehook_consider_fatal_signal(tsk, sig, handler); |
308 | (tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL); | ||
309 | } | 309 | } |
310 | 310 | ||
311 | 311 | ||
@@ -761,7 +761,8 @@ static void complete_signal(int sig, struct task_struct *p, int group) | |||
761 | if (sig_fatal(p, sig) && | 761 | if (sig_fatal(p, sig) && |
762 | !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) && | 762 | !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) && |
763 | !sigismember(&t->real_blocked, sig) && | 763 | !sigismember(&t->real_blocked, sig) && |
764 | (sig == SIGKILL || !(t->ptrace & PT_PTRACED))) { | 764 | (sig == SIGKILL || |
765 | !tracehook_consider_fatal_signal(t, sig, SIG_DFL))) { | ||
765 | /* | 766 | /* |
766 | * This signal will be fatal to the whole group. | 767 | * This signal will be fatal to the whole group. |
767 | */ | 768 | */ |