diff options
author | jeff <jeff@FreeBSD.org> | 2005-12-23 21:33:55 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-12-23 21:33:55 +0000 |
commit | f1d333e1f58d5cd9b13504c6c7ce20dbdd94c59e (patch) | |
tree | a85b28a4c710154b53c92673280c6796e3e24e7c /sys | |
parent | e2af894dc58b88ca48c5044e90e3b76abed2b922 (diff) | |
download | FreeBSD-src-f1d333e1f58d5cd9b13504c6c7ce20dbdd94c59e.zip FreeBSD-src-f1d333e1f58d5cd9b13504c6c7ce20dbdd94c59e.tar.gz |
- Improve the INKERNEL macro such that it can no longer give false positives.
This fixes the stack(9) functionality.
Submitted by: Antoine Brodin <antoine.brodin@laposte.net>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/db_trace.c | 6 | ||||
-rw-r--r-- | sys/i386/i386/db_trace.c | 7 |
2 files changed, 11 insertions, 2 deletions
diff --git a/sys/amd64/amd64/db_trace.c b/sys/amd64/amd64/db_trace.c index d426395..274d56f 100644 --- a/sys/amd64/amd64/db_trace.c +++ b/sys/amd64/amd64/db_trace.c @@ -180,7 +180,7 @@ db_ss(struct db_variable *vp, db_expr_t *valuep, int op) * Stack trace. */ #define INKERNEL(va) (((va) >= DMAP_MIN_ADDRESS && (va) < DMAP_MAX_ADDRESS) \ - || (va) >= KERNBASE) + || ((va) >= KERNBASE && (va) < VM_MAX_KERNEL_ADDRESS)) struct amd64_frame { struct amd64_frame *f_frame; @@ -515,6 +515,10 @@ stack_save(struct stack *st) break; if (stack_put(st, callpc) == -1) break; + if (frame->f_frame <= frame || + (vm_offset_t)frame->f_frame >= + (vm_offset_t)rbp + KSTACK_PAGES * PAGE_SIZE) + break; frame = frame->f_frame; } } diff --git a/sys/i386/i386/db_trace.c b/sys/i386/i386/db_trace.c index 1fbcd43..fb8d0b0 100644 --- a/sys/i386/i386/db_trace.c +++ b/sys/i386/i386/db_trace.c @@ -168,7 +168,8 @@ db_ss(struct db_variable *vp, db_expr_t *valuep, int op) /* * Stack trace. */ -#define INKERNEL(va) (((vm_offset_t)(va)) >= USRSTACK) +#define INKERNEL(va) (((vm_offset_t)(va)) >= USRSTACK && \ + ((vm_offset_t)(va)) < VM_MAX_KERNEL_ADDRESS) struct i386_frame { struct i386_frame *f_frame; @@ -525,6 +526,10 @@ stack_save(struct stack *st) break; if (stack_put(st, callpc) == -1) break; + if (frame->f_frame <= frame || + (vm_offset_t)frame->f_frame >= + (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE) + break; frame = frame->f_frame; } } |