git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
parisc: Fix kernel crash with reversed copy_from_user()
[pandora-kernel.git]
/
arch
/
parisc
/
kernel
/
traps.c
diff --git
a/arch/parisc/kernel/traps.c
b/arch/parisc/kernel/traps.c
index
8b58bf0
..
73102ea
100644
(file)
--- a/
arch/parisc/kernel/traps.c
+++ b/
arch/parisc/kernel/traps.c
@@
-33,7
+33,7
@@
#include <asm/irq.h>
#include <asm/traps.h>
#include <asm/unaligned.h>
#include <asm/irq.h>
#include <asm/traps.h>
#include <asm/unaligned.h>
-#include <
asm
/atomic.h>
+#include <
linux
/atomic.h>
#include <asm/smp.h>
#include <asm/pdc.h>
#include <asm/pdc_chassis.h>
#include <asm/smp.h>
#include <asm/pdc.h>
#include <asm/pdc_chassis.h>
@@
-811,14
+811,17
@@
void notrace handle_interruption(int code, struct pt_regs *regs)
else {
/*
else {
/*
- * The kernel should never fault on its own address space.
+ * The kernel should never fault on its own address space,
+ * unless pagefault_disable() was called before.
*/
*/
- if (fault_space == 0
)
+ if (fault_space == 0
&& !in_atomic())
{
{
+ /* Clean up and return if in exception table. */
+ if (fixup_exception(regs))
+ return;
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
parisc_terminate("Kernel Fault", regs, code, fault_address);
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
parisc_terminate("Kernel Fault", regs, code, fault_address);
-
}
}
}
}