Make backtraces more robust
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 28 Aug 2015 19:30:58 +0000 (15:30 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
It's always dangerous for the kernel to backtrace a user context, but it
is still useful.  On occasion, BTs will have bad, but not 0, frame
pointers.  This will crash the kernel.  Ensuring that the frame pointers
are at least in mmap-able space catches a bunch of these scenarios.

kern/arch/x86/kdebug.c

index ec8795b..8df0b3b 100644 (file)
@@ -307,7 +307,7 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
                       size_t nr_slots)
 {
        size_t nr_pcs = 0;
-       while (fp && nr_pcs < nr_slots) {
+       while ((fp > MMAP_LOWEST_VA) && (nr_pcs < nr_slots)) {
                /* could put some sanity checks in here...  i used to at least check for
                 * kernel addrs, but now we also bt user stacks. (dangerous!) */
                pcs[nr_pcs++] = pc;