x86: avoids bad frame pointers in backtrace
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Aug 2014 02:06:56 +0000 (19:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Aug 2014 02:06:56 +0000 (19:06 -0700)
Backtrace will stop backtracing if it hits a non-canonical, non-kernel address.
It'll still record the PC, so we can see some evidence of the corruption.

Thanks to Drew for pointing this out and providing a fix.

kern/arch/x86/kdebug.c

index 0e3fffc..6a6853b 100644 (file)
@@ -314,6 +314,8 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
        while (fp && nr_pcs < nr_slots) {
                /* could put some sanity checks in here... */
                pcs[nr_pcs++] = pc;
+               if (!is_kaddr((void*)fp))
+                       break;
                /* PC becomes the retaddr - 1.  the -1 is to put our PC back inside the
                 * function that called us.  this was necessary in case we called as the
                 * last instruction in a function (would have to never return).  not