From 34bbe3bcb8a55bbd80b0478862c58c9451b76a1e Mon Sep 17 00:00:00 2001 From: Xiaoming Gao Date: Tue, 19 Feb 2019 15:25:47 +0800 Subject: [PATCH] signal: add print_fatal_signals_src_dst sysctl to switch dump fatal signals from sender side the print_fatal_signals sysctl can only dump fatal signals from receiver's side, cannot find who and why send these fatal signals, so add a new sysctl print_fatal_signals_src_dst to switch dump fatal signals from sender side. Signed-off-by: Xiaoming Gao --- include/linux/signal.h | 1 + kernel/signal.c | 11 +++++++++++ kernel/sysctl.c | 7 +++++++ 3 files changed, 19 insertions(+) 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",