diff options
author | ian <ian@FreeBSD.org> | 2014-05-18 16:02:56 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2014-05-18 16:02:56 +0000 |
commit | de651b30e730164993d4fa41093184fac17ca6c7 (patch) | |
tree | 840ec801fa1fb81d78663d2b07f72832276e8fed | |
parent | 4670db3f86733b03125d5881a2806efdd3defd14 (diff) | |
download | FreeBSD-src-de651b30e730164993d4fa41093184fac17ca6c7.zip FreeBSD-src-de651b30e730164993d4fa41093184fac17ca6c7.tar.gz |
MFC 256941: make sure the frame is indeed in the kernel memory.
-rw-r--r-- | sys/arm/arm/stack_machdep.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/arm/arm/stack_machdep.c b/sys/arm/arm/stack_machdep.c index 36a776a..f1708f5 100644 --- a/sys/arm/arm/stack_machdep.c +++ b/sys/arm/arm/stack_machdep.c @@ -43,13 +43,16 @@ __FBSDID("$FreeBSD$"); * APCS where it lays out the stack incorrectly. Because of this we disable * this when building for ARM EABI or when building with clang. */ + +extern vm_offset_t kernel_vm_end; + static void stack_capture(struct stack *st, u_int32_t *frame) { #if !defined(__ARM_EABI__) && !defined(__clang__) vm_offset_t callpc; - while (INKERNEL(frame)) { + while (INKERNEL(frame) && (vm_offset_t)frame < kernel_vm_end) { callpc = frame[FR_SCP]; if (stack_put(st, callpc) == -1) break; |