| From 96054569190bdec375fe824e48ca1f4e3b53dd36 Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Fri, 13 Aug 2010 09:49:20 -0700 |
| Subject: x86: don't send SIGBUS for kernel page faults |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| commit 96054569190bdec375fe824e48ca1f4e3b53dd36 upstream. |
| |
| It's wrong for several reasons, but the most direct one is that the |
| fault may be for the stack accesses to set up a previous SIGBUS. When |
| we have a kernel exception, the kernel exception handler does all the |
| fixups, not some user-level signal handler. |
| |
| Even apart from the nested SIGBUS issue, it's also wrong to give out |
| kernel fault addresses in the signal handler info block, or to send a |
| SIGBUS when a system call already returns EFAULT. |
| |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/mm/fault.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/mm/fault.c |
| +++ b/arch/x86/mm/fault.c |
| @@ -802,8 +802,10 @@ do_sigbus(struct pt_regs *regs, unsigned |
| up_read(&mm->mmap_sem); |
| |
| /* Kernel mode? Handle exceptions or die: */ |
| - if (!(error_code & PF_USER)) |
| + if (!(error_code & PF_USER)) { |
| no_context(regs, error_code, address); |
| + return; |
| + } |
| |
| /* User-space => ok to do another page fault: */ |
| if (is_prefetch(regs, error_code, address)) |