aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/mm/fault.c4
-rw-r--r--arch/x86/mm/fault.c4
-rw-r--r--include/linux/sched.h2
-rw-r--r--kernel/trace/trace_stack.c2
4 files changed, 5 insertions, 7 deletions
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 35d0760c3fa4..99b2f2775658 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -507,7 +507,6 @@ bail:
507void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) 507void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
508{ 508{
509 const struct exception_table_entry *entry; 509 const struct exception_table_entry *entry;
510 unsigned long *stackend;
511 510
512 /* Are we prepared to handle this fault? */ 511 /* Are we prepared to handle this fault? */
513 if ((entry = search_exception_tables(regs->nip)) != NULL) { 512 if ((entry = search_exception_tables(regs->nip)) != NULL) {
@@ -536,8 +535,7 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
536 printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n", 535 printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
537 regs->nip); 536 regs->nip);
538 537
539 stackend = end_of_stack(current); 538 if (task_stack_end_corrupted(current))
540 if (*stackend != STACK_END_MAGIC)
541 printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); 539 printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
542 540
543 die("Kernel access of bad area", regs, sig); 541 die("Kernel access of bad area", regs, sig);
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index bc23a7043c65..6240bc7ae741 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -648,7 +648,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
648 unsigned long address, int signal, int si_code) 648 unsigned long address, int signal, int si_code)
649{ 649{
650 struct task_struct *tsk = current; 650 struct task_struct *tsk = current;
651 unsigned long *stackend;
652 unsigned long flags; 651 unsigned long flags;
653 int sig; 652 int sig;
654 653
@@ -708,8 +707,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
708 707
709 show_fault_oops(regs, error_code, address); 708 show_fault_oops(regs, error_code, address);
710 709
711 stackend = end_of_stack(tsk); 710 if (task_stack_end_corrupted(tsk))
712 if (*stackend != STACK_END_MAGIC)
713 printk(KERN_EMERG "Thread overran stack, or stack corrupted\n"); 711 printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");
714 712
715 tsk->thread.cr2 = address; 713 tsk->thread.cr2 = address;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 118dca7d5a28..18f52624eaa6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2617,6 +2617,8 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
2617} 2617}
2618 2618
2619#endif 2619#endif
2620#define task_stack_end_corrupted(task) \
2621 (*(end_of_stack(task)) != STACK_END_MAGIC)
2620 2622
2621static inline int object_is_on_stack(void *obj) 2623static inline int object_is_on_stack(void *obj)
2622{ 2624{
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 1636e41828c2..16eddb308c33 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -170,7 +170,7 @@ check_stack(unsigned long ip, unsigned long *stack)
170 i++; 170 i++;
171 } 171 }
172 172
173 if (*end_of_stack(current) != STACK_END_MAGIC) { 173 if (task_stack_end_corrupted(current)) {
174 print_max_stack(); 174 print_max_stack();
175 BUG(); 175 BUG();
176 } 176 }