diff --git a/include/linux/signal.h b/include/linux/signal.h index 843bd62b1..470e80a3f 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -10,6 +10,7 @@ struct task_struct; /* for sysctl */ extern int print_fatal_signals; +extern int print_fatal_signals_src_dst; static inline void copy_siginfo(struct siginfo *to, struct siginfo *from) { diff --git a/kernel/signal.c b/kernel/signal.c index 619c6160f..4e0c68326 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -58,6 +58,7 @@ static struct kmem_cache *sigqueue_cachep; int print_fatal_signals __read_mostly; +int print_fatal_signals_src_dst __read_mostly; static void __user *sig_handler(struct task_struct *t, int sig) { @@ -1041,6 +1042,16 @@ static int __send_signal(int sig, struct siginfo *info, struct task_struct *t, int override_rlimit; int ret = 0, result; + if (print_fatal_signals_src_dst && sig_kernel_coredump(sig)) { + printk(KERN_INFO "pid: %d, comm: %s try to send fatal sig: %d to pid: %d, comm: %s\n", + current->pid, + current->comm, + sig, + t->pid, + t->comm); + dump_stack(); + } + assert_spin_locked(&t->sighand->siglock); result = TRACE_SIGNAL_IGNORED; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 891e587d3..11116de08 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -344,6 +344,13 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif + { + .procname = "print-fatal-signals-src-dst", + .data = &print_fatal_signals_src_dst, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, #ifdef CONFIG_SCHED_DEBUG { .procname = "sched_min_granularity_ns",