|
@@ -718,6 +718,37 @@ out_set:
|
|
|
#define LEGACY_QUEUE(sigptr, sig) \
|
|
|
(((sig) < SIGRTMIN) && sigismember(&(sigptr)->signal, (sig)))
|
|
|
|
|
|
+int print_fatal_signals;
|
|
|
+
|
|
|
+static void print_fatal_signal(struct pt_regs *regs, int signr)
|
|
|
+{
|
|
|
+ printk("%s/%d: potentially unexpected fatal signal %d.\n",
|
|
|
+ current->comm, current->pid, signr);
|
|
|
+
|
|
|
+#ifdef __i386__
|
|
|
+ printk("code at %08lx: ", regs->eip);
|
|
|
+ {
|
|
|
+ int i;
|
|
|
+ for (i = 0; i < 16; i++) {
|
|
|
+ unsigned char insn;
|
|
|
+
|
|
|
+ __get_user(insn, (unsigned char *)(regs->eip + i));
|
|
|
+ printk("%02x ", insn);
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ printk("\n");
|
|
|
+ show_regs(regs);
|
|
|
+}
|
|
|
+
|
|
|
+static int __init setup_print_fatal_signals(char *str)
|
|
|
+{
|
|
|
+ get_option (&str, &print_fatal_signals);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+__setup("print-fatal-signals=", setup_print_fatal_signals);
|
|
|
|
|
|
static int
|
|
|
specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
|
|
@@ -1855,6 +1886,8 @@ relock:
|
|
|
* Anything else is fatal, maybe with a core dump.
|
|
|
*/
|
|
|
current->flags |= PF_SIGNALED;
|
|
|
+ if ((signr != SIGKILL) && print_fatal_signals)
|
|
|
+ print_fatal_signal(regs, signr);
|
|
|
if (sig_kernel_coredump(signr)) {
|
|
|
/*
|
|
|
* If it was able to dump core, this kills all
|