diff options
-rw-r--r-- | arch/powerpc/mm/fault.c | 4 | ||||
-rw-r--r-- | arch/x86/mm/fault.c | 4 | ||||
-rw-r--r-- | include/linux/sched.h | 2 | ||||
-rw-r--r-- | kernel/trace/trace_stack.c | 2 |
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: | |||
507 | void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) | 507 | void 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 | ||
2621 | static inline int object_is_on_stack(void *obj) | 2623 | static 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 | } |