Re: [PATCH] powerpc: Check end of stack canary at oops time

2010-08-29 Thread Benjamin Herrenschmidt
On Wed, 2010-08-25 at 09:15 +1000, Anton Blanchard wrote:

   /* Are we prepared to handle this fault?  */
   if ((entry = search_exception_tables(regs-nip)) != NULL) {
 @@ -413,5 +415,9 @@ void bad_page_fault(struct pt_regs *regs
   printk(KERN_ALERT Faulting instruction address: 0x%08lx\n,
   regs-nip);
  
 + stackend = end_of_stack(current);
 + if (current != init_task  *stackend != STACK_END_MAGIC)
 + printk(KERN_ALERT Thread overran stack, or stack corrupted\n);
 +
   die(Kernel access of bad area, regs, sig);
  }

Is it worth making it a __get_user or similar just in case ? I suppose
if the stack is really busted we wouldn't even have reached that
code ...

Cheers,
Ben.

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc: Check end of stack canary at oops time

2010-08-24 Thread Anton Blanchard

Add a check for the stack canary when we oops, similar to x86. This should make
it clear that we overran our stack:

Unable to handle kernel paging request for data at address 0x24652f63700ac689
Faulting instruction address: 0xc0063d24
Thread overran stack, or stack corrupted

Signed-off-by: Anton Blanchard an...@samba.org
---

Index: powerpc.git/arch/powerpc/mm/fault.c
===
--- powerpc.git.orig/arch/powerpc/mm/fault.c2010-08-25 08:41:08.230086186 
+1000
+++ powerpc.git/arch/powerpc/mm/fault.c 2010-08-25 09:12:38.276553103 +1000
@@ -30,6 +30,7 @@
 #include linux/kprobes.h
 #include linux/kdebug.h
 #include linux/perf_event.h
+#include linux/magic.h
 
 #include asm/firmware.h
 #include asm/page.h
@@ -385,6 +386,7 @@ do_sigbus:
 void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
 {
const struct exception_table_entry *entry;
+   unsigned long *stackend;
 
/* Are we prepared to handle this fault?  */
if ((entry = search_exception_tables(regs-nip)) != NULL) {
@@ -413,5 +415,9 @@ void bad_page_fault(struct pt_regs *regs
printk(KERN_ALERT Faulting instruction address: 0x%08lx\n,
regs-nip);
 
+   stackend = end_of_stack(current);
+   if (current != init_task  *stackend != STACK_END_MAGIC)
+   printk(KERN_ALERT Thread overran stack, or stack corrupted\n);
+
die(Kernel access of bad area, regs, sig);
 }
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: Check end of stack canary at oops time

2010-08-24 Thread Michael Ellerman
On Wed, 2010-08-25 at 09:15 +1000, Anton Blanchard wrote:
 Add a check for the stack canary when we oops, similar to x86. This should 
 make
 it clear that we overran our stack:
 
 Unable to handle kernel paging request for data at address 0x24652f63700ac689
 Faulting instruction address: 0xc0063d24
 Thread overran stack, or stack corrupted
 
 Signed-off-by: Anton Blanchard an...@samba.org
 ---
 
 Index: powerpc.git/arch/powerpc/mm/fault.c
 ===
 --- powerpc.git.orig/arch/powerpc/mm/fault.c  2010-08-25 08:41:08.230086186 
 +1000
 +++ powerpc.git/arch/powerpc/mm/fault.c   2010-08-25 09:12:38.276553103 
 +1000
 @@ -30,6 +30,7 @@
  #include linux/kprobes.h
  #include linux/kdebug.h
  #include linux/perf_event.h
 +#include linux/magic.h
  
  #include asm/firmware.h
  #include asm/page.h
 @@ -385,6 +386,7 @@ do_sigbus:
  void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
  {
   const struct exception_table_entry *entry;
 + unsigned long *stackend;
  
   /* Are we prepared to handle this fault?  */
   if ((entry = search_exception_tables(regs-nip)) != NULL) {
 @@ -413,5 +415,9 @@ void bad_page_fault(struct pt_regs *regs
   printk(KERN_ALERT Faulting instruction address: 0x%08lx\n,
   regs-nip);
  
 + stackend = end_of_stack(current);
 + if (current != init_task  *stackend != STACK_END_MAGIC)
 + printk(KERN_ALERT Thread overran stack, or stack corrupted\n);

The check for init is just because we haven't set the magic value for
init's stack right? But we could.

cheers



signature.asc
Description: This is a digitally signed message part
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH] powerpc: Check end of stack canary at oops time

2010-08-24 Thread Anton Blanchard
 
Hi,

 The check for init is just because we haven't set the magic value for
 init's stack right? But we could.

Yeah, it's similar to what x86 are doing now:


commit 0e7810be30f66e9f430c4ce2cd3b14634211690f
Author: Jan Beulich jbeul...@novell.com
Date:   Fri Nov 20 14:00:14 2009 +

x86: Suppress stack overrun message for init_task

init_task doesn't get its stack end location set to
STACK_END_MAGIC, and hence the message is confusing
rather than helpful in this case.


Adding it directly to init_task would be nice but I suspect we'd
either have to make assumptions about end_of_stack in our code or move the
canary into the thread_info (so we can statically allocate it via
INIT_THREAD_INFO()) or do it at runtime somewhere, hopefully early enough that
we couldn't take an oops.

Anton
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev