From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev list <linuxppc-dev@ozlabs.org>, Greg KH <greg@kroah.com>
Subject: [PATCH] powerpc: Make alignment exception always check exception table (#2)
Date: Wed, 01 Nov 2006 14:42:20 +1100 [thread overview]
Message-ID: <1162352540.25682.391.camel@localhost.localdomain> (raw)
In-Reply-To: <1162350571.25682.389.camel@localhost.localdomain>
The alignment exception used to only check the exception table for
-EFAULT, not for other errors. That opens an oops window if we can
coerce the kernel into getting an alignment exception for other reasons
in what would normally be a user-protected accessor, which can be done
via some of the futex ops. This fixes it by always checking the
exception tables.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
Paul: this version also fixes arch/ppc
This is 2.6.19 material and should probably go into stable as well.
(Greg: take it if paulus acks it and it applies :)
Index: linux-work/arch/powerpc/kernel/traps.c
===================================================================
--- linux-work.orig/arch/powerpc/kernel/traps.c 2006-10-23 14:41:37.000000000 +1000
+++ linux-work/arch/powerpc/kernel/traps.c 2006-10-30 13:59:41.000000000 +1100
@@ -843,7 +843,7 @@ void __kprobes program_check_exception(s
void alignment_exception(struct pt_regs *regs)
{
- int fixed = 0;
+ int sig, fixed = 0;
/* we don't implement logging of alignment exceptions */
if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))
@@ -856,15 +856,11 @@ void alignment_exception(struct pt_regs
}
/* Operand address was bad */
- if (fixed == -EFAULT) {
- if (user_mode(regs))
- _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar);
- else
- /* Search exception table */
- bad_page_fault(regs, regs->dar, SIGSEGV);
- return;
- }
- _exception(SIGBUS, regs, BUS_ADRALN, regs->dar);
+ sig = fixed == -EFAULT ? SIGSEGV : SIGBUS;
+ if (user_mode(regs))
+ _exception(sig, regs, SEGV_ACCERR, regs->dar);
+ else
+ bad_page_fault(regs, regs->dar, sig);
}
void StackOverflow(struct pt_regs *regs)
Index: linux-work/arch/ppc/kernel/traps.c
===================================================================
--- linux-work.orig/arch/ppc/kernel/traps.c 2006-10-06 13:47:55.000000000 +1000
+++ linux-work/arch/ppc/kernel/traps.c 2006-11-01 14:39:44.000000000 +1100
@@ -708,7 +708,7 @@ void single_step_exception(struct pt_reg
void alignment_exception(struct pt_regs *regs)
{
- int fixed;
+ int sig, fixed = 0;
fixed = fix_alignment(regs);
if (fixed == 1) {
@@ -716,15 +716,11 @@ void alignment_exception(struct pt_regs
emulate_single_step(regs);
return;
}
- if (fixed == -EFAULT) {
- /* fixed == -EFAULT means the operand address was bad */
- if (user_mode(regs))
- _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar);
- else
- bad_page_fault(regs, regs->dar, SIGSEGV);
- return;
- }
- _exception(SIGBUS, regs, BUS_ADRALN, regs->dar);
+ sig = fixed == -EFAULT ? SIGSEGV : SIGBUS;
+ if (user_mode(regs))
+ _exception(sig, regs, SEGV_ACCERR, regs->dar);
+ else
+ bad_page_fault(regs, regs->dar, sig);
}
void StackOverflow(struct pt_regs *regs)
next prev parent reply other threads:[~2006-11-01 3:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-01 3:09 [PATCH] powerpc: Make alignment exception always check exception table Benjamin Herrenschmidt
2006-11-01 3:42 ` Benjamin Herrenschmidt [this message]
2006-11-01 4:11 ` [PATCH] powerpc: Make alignment exception always check exception table (#3) Benjamin Herrenschmidt
2006-11-01 6:34 ` [PATCH] powerpc: Make alignment exception always check exception table Greg KH
2006-11-01 20:43 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1162352540.25682.391.camel@localhost.localdomain \
--to=benh@kernel.crashing.org \
--cc=greg@kroah.com \
--cc=linuxppc-dev@ozlabs.org \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).