diff options
| -rw-r--r-- | kernel/signal.c | 17 |
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) | |||
| 2084 | static int ptrace_signal(int signr, siginfo_t *info, | 2084 | static 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) |
