Check if frame is addressable while unwinding
This checks if frame is addressable for unwinding
during generation of the stacktrace
Bug: 18945192
Change-Id: I1c12a16c71d16c608042f74785a9dc3c3bd0a27a
diff --git a/main/coregrind/m_libcassert.c b/main/coregrind/m_libcassert.c
index d8fe923..38a5a5f 100644
--- a/main/coregrind/m_libcassert.c
+++ b/main/coregrind/m_libcassert.c
@@ -134,8 +134,8 @@
: /* trash */ "memory" \
); \
(srP)->r_pc = block[0] - 8; \
- (srP)->r_sp = block[1]; \
- (srP)->misc.ARM.r14 = block[2]; \
+ (srP)->misc.ARM.r14 = block[1]; \
+ (srP)->r_sp = block[2]; \
(srP)->misc.ARM.r12 = block[3]; \
(srP)->misc.ARM.r11 = block[4]; \
(srP)->misc.ARM.r7 = block[5]; \
diff --git a/main/coregrind/m_stacktrace.c b/main/coregrind/m_stacktrace.c
index c38a4a8..bbf9658 100644
--- a/main/coregrind/m_stacktrace.c
+++ b/main/coregrind/m_stacktrace.c
@@ -932,6 +932,12 @@
if (fp_max >= sizeof(Addr))
fp_max -= sizeof(Addr);
+ // Check if frame is addressable by valgrind or client
+ if (!VG_(am_is_valid_for_valgrind)(fp_min, fp_max - fp_min, VKI_PROT_READ)
+ && !VG_(am_is_valid_for_client)(fp_min, fp_max - fp_min, VKI_PROT_READ)) {
+ return 1;
+ }
+
if (debug)
VG_(printf)("\nmax_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
"fp_max=0x%lx r15=0x%lx r13=0x%lx\n",