|
@@ -1754,17 +1754,33 @@ relock:
|
|
|
do_signal_stop(0))
|
|
|
goto relock;
|
|
|
|
|
|
- signr = dequeue_signal(current, ¤t->blocked, info);
|
|
|
- if (!signr)
|
|
|
- break; /* will return 0 */
|
|
|
+ /*
|
|
|
+ * Tracing can induce an artifical signal and choose sigaction.
|
|
|
+ * The return value in @signr determines the default action,
|
|
|
+ * but @info->si_signo is the signal number we will report.
|
|
|
+ */
|
|
|
+ signr = tracehook_get_signal(current, regs, info, return_ka);
|
|
|
+ if (unlikely(signr < 0))
|
|
|
+ goto relock;
|
|
|
+ if (unlikely(signr != 0))
|
|
|
+ ka = return_ka;
|
|
|
+ else {
|
|
|
+ signr = dequeue_signal(current, ¤t->blocked,
|
|
|
+ info);
|
|
|
|
|
|
- if (signr != SIGKILL) {
|
|
|
- signr = ptrace_signal(signr, info, regs, cookie);
|
|
|
if (!signr)
|
|
|
- continue;
|
|
|
+ break; /* will return 0 */
|
|
|
+
|
|
|
+ if (signr != SIGKILL) {
|
|
|
+ signr = ptrace_signal(signr, info,
|
|
|
+ regs, cookie);
|
|
|
+ if (!signr)
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ ka = &sighand->action[signr-1];
|
|
|
}
|
|
|
|
|
|
- ka = &sighand->action[signr-1];
|
|
|
if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
|
|
|
continue;
|
|
|
if (ka->sa.sa_handler != SIG_DFL) {
|
|
@@ -1812,7 +1828,7 @@ relock:
|
|
|
spin_lock_irq(&sighand->siglock);
|
|
|
}
|
|
|
|
|
|
- if (likely(do_signal_stop(signr))) {
|
|
|
+ if (likely(do_signal_stop(info->si_signo))) {
|
|
|
/* It released the siglock. */
|
|
|
goto relock;
|
|
|
}
|
|
@@ -1833,7 +1849,7 @@ relock:
|
|
|
|
|
|
if (sig_kernel_coredump(signr)) {
|
|
|
if (print_fatal_signals)
|
|
|
- print_fatal_signal(regs, signr);
|
|
|
+ print_fatal_signal(regs, info->si_signo);
|
|
|
/*
|
|
|
* If it was able to dump core, this kills all
|
|
|
* other threads in the group and synchronizes with
|
|
@@ -1842,13 +1858,13 @@ relock:
|
|
|
* first and our do_group_exit call below will use
|
|
|
* that value and ignore the one we pass it.
|
|
|
*/
|
|
|
- do_coredump((long)signr, signr, regs);
|
|
|
+ do_coredump(info->si_signo, info->si_signo, regs);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* Death signals, no core dump.
|
|
|
*/
|
|
|
- do_group_exit(signr);
|
|
|
+ do_group_exit(info->si_signo);
|
|
|
/* NOTREACHED */
|
|
|
}
|
|
|
spin_unlock_irq(&sighand->siglock);
|