diff options
Diffstat (limited to 'arch/x86/kernel/signal_32.c')
-rw-r--r-- | arch/x86/kernel/signal_32.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index 3e4a688bb84f..76d05d703845 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
@@ -243,7 +243,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long __unused) | |||
243 | return ax; | 243 | return ax; |
244 | 244 | ||
245 | badframe: | 245 | badframe: |
246 | force_sig(SIGSEGV, current); | 246 | signal_fault(regs, frame, "rt sigreturn"); |
247 | return 0; | 247 | return 0; |
248 | } | 248 | } |
249 | 249 | ||
@@ -669,3 +669,19 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) | |||
669 | 669 | ||
670 | clear_thread_flag(TIF_IRET); | 670 | clear_thread_flag(TIF_IRET); |
671 | } | 671 | } |
672 | |||
673 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | ||
674 | { | ||
675 | struct task_struct *me = current; | ||
676 | |||
677 | if (show_unhandled_signals && printk_ratelimit()) { | ||
678 | printk(KERN_INFO | ||
679 | "%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", | ||
680 | me->comm, me->pid, where, frame, | ||
681 | regs->ip, regs->sp, regs->orig_ax); | ||
682 | print_vma_addr(" in ", regs->ip); | ||
683 | printk(KERN_CONT "\n"); | ||
684 | } | ||
685 | |||
686 | force_sig(SIGSEGV, me); | ||
687 | } | ||