Author: marius
Date: Tue Dec  8 20:18:54 2009
New Revision: 200272
URL: http://svn.freebsd.org/changeset/base/200272

Log:
  Add additional checks of the kernel stack addresses in order to
  ensure we don't overrun the end of the call chain.
  
  MFC after:    1 week

Modified:
  head/sys/sparc64/sparc64/stack_machdep.c
  head/sys/sun4v/sun4v/stack_machdep.c

Modified: head/sys/sparc64/sparc64/stack_machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/stack_machdep.c    Tue Dec  8 19:18:32 2009        
(r200271)
+++ head/sys/sparc64/sparc64/stack_machdep.c    Tue Dec  8 20:18:54 2009        
(r200272)
@@ -36,15 +36,20 @@ __FBSDID("$FreeBSD$");
 #include <machine/stack.h>
 #include <machine/vmparam.h>
 
-static void stack_capture(struct stack *st, struct frame *fp);
+static void stack_capture(struct stack *st, struct frame *frame);
 
 static void
-stack_capture(struct stack *st, struct frame *fp)
+stack_capture(struct stack *st, struct frame *frame)
 {
+       struct frame *fp;
        vm_offset_t callpc;
 
        stack_zero(st);
-       while (1) {
+       fp = frame;
+       for (;;) {
+               if (!INKERNEL((vm_offset_t)fp) ||
+                   !ALIGNED_POINTER(fp, uint64_t))
+                        break;
                callpc = fp->fr_pc;
                if (!INKERNEL(callpc))
                        break;
@@ -56,6 +61,9 @@ stack_capture(struct stack *st, struct f
                        break;
                if (stack_put(st, callpc) == -1)
                        break;
+               if (v9next_frame(fp) <= fp ||
+                   v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE)
+                       break;
                fp = v9next_frame(fp);
        }
 }

Modified: head/sys/sun4v/sun4v/stack_machdep.c
==============================================================================
--- head/sys/sun4v/sun4v/stack_machdep.c        Tue Dec  8 19:18:32 2009        
(r200271)
+++ head/sys/sun4v/sun4v/stack_machdep.c        Tue Dec  8 20:18:54 2009        
(r200272)
@@ -36,20 +36,28 @@ __FBSDID("$FreeBSD$");
 #include <machine/stack.h>
 #include <machine/vmparam.h>
 
-static void stack_capture(struct stack *st, struct frame *fp);
+static void stack_capture(struct stack *st, struct frame *frame);
 
 static void
-stack_capture(struct stack *st, struct frame *fp)
+stack_capture(struct stack *st, struct frame *frame)
 {
+       struct frame *fp;
        vm_offset_t callpc;
 
        stack_zero(st);
-       while (1) {
+       fp = frame;
+       for (;;) {
+               if (!INKERNEL((vm_offset_t)fp) ||
+                   !ALIGNED_POINTER(fp, uint64_t))
+                        break;
                callpc = fp->fr_pc;
                if (!INKERNEL(callpc))
                        break;
                if (stack_put(st, callpc) == -1)
                        break;
+               if (v9next_frame(fp) <= fp ||
+                   v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE)
+                       break;
                fp = v9next_frame(fp);
        }
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to