aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/signal.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 0a1bf2c8bdcd..c34f8f899b76 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2084,12 +2084,17 @@ static void do_jobctl_trap(void)
2084static int ptrace_signal(int signr, siginfo_t *info, 2084static int ptrace_signal(int signr, siginfo_t *info,
2085 struct pt_regs *regs, void *cookie) 2085 struct pt_regs *regs, void *cookie)
2086{ 2086{
2087 if (!current->ptrace)
2088 return signr;
2089
2090 ptrace_signal_deliver(regs, cookie); 2087 ptrace_signal_deliver(regs, cookie);
2091 2088 /*
2092 /* Let the debugger run. */ 2089 * We do not check sig_kernel_stop(signr) but set this marker
2090 * unconditionally because we do not know whether debugger will
2091 * change signr. This flag has no meaning unless we are going
2092 * to stop after return from ptrace_stop(). In this case it will
2093 * be checked in do_signal_stop(), we should only stop if it was
2094 * not cleared by SIGCONT while we were sleeping. See also the
2095 * comment in dequeue_signal().
2096 */
2097 current->jobctl |= JOBCTL_STOP_DEQUEUED;
2093 ptrace_stop(signr, CLD_TRAPPED, 0, info); 2098 ptrace_stop(signr, CLD_TRAPPED, 0, info);
2094 2099
2095 /* We're back. Did the debugger cancel the sig? */ 2100 /* We're back. Did the debugger cancel the sig? */
@@ -2193,7 +2198,7 @@ relock:
2193 if (!signr) 2198 if (!signr)
2194 break; /* will return 0 */ 2199 break; /* will return 0 */
2195 2200
2196 if (signr != SIGKILL) { 2201 if (unlikely(current->ptrace) && signr != SIGKILL) {
2197 signr = ptrace_signal(signr, info, 2202 signr = ptrace_signal(signr, info,
2198 regs, cookie); 2203 regs, cookie);
2199 if (!signr) 2204 if (!signr)