|
@@ -25,6 +25,7 @@
|
|
#include <linux/kprobes.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/kdebug.h>
|
|
#include <linux/kdebug.h>
|
|
|
|
+#include <linux/magic.h>
|
|
|
|
|
|
#include <asm/system.h>
|
|
#include <asm/system.h>
|
|
#include <asm/desc.h>
|
|
#include <asm/desc.h>
|
|
@@ -581,6 +582,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
|
unsigned long address;
|
|
unsigned long address;
|
|
int write, si_code;
|
|
int write, si_code;
|
|
int fault;
|
|
int fault;
|
|
|
|
+ unsigned long *stackend;
|
|
|
|
+
|
|
#ifdef CONFIG_X86_64
|
|
#ifdef CONFIG_X86_64
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
#endif
|
|
#endif
|
|
@@ -850,6 +853,10 @@ no_context:
|
|
|
|
|
|
show_fault_oops(regs, error_code, address);
|
|
show_fault_oops(regs, error_code, address);
|
|
|
|
|
|
|
|
+ stackend = end_of_stack(tsk);
|
|
|
|
+ if (*stackend != STACK_END_MAGIC)
|
|
|
|
+ printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
|
|
|
+
|
|
tsk->thread.cr2 = address;
|
|
tsk->thread.cr2 = address;
|
|
tsk->thread.trap_no = 14;
|
|
tsk->thread.trap_no = 14;
|
|
tsk->thread.error_code = error_code;
|
|
tsk->thread.error_code = error_code;
|