aboutsummaryrefslogtreecommitdiff
path: root/src/processor
diff options
context:
space:
mode:
Diffstat (limited to 'src/processor')
-rw-r--r--src/processor/stackwalker_amd64.cc6
-rw-r--r--src/processor/stackwalker_amd64_unittest.cc3
2 files changed, 8 insertions, 1 deletions
diff --git a/src/processor/stackwalker_amd64.cc b/src/processor/stackwalker_amd64.cc
index 440724a1..d1333248 100644
--- a/src/processor/stackwalker_amd64.cc
+++ b/src/processor/stackwalker_amd64.cc
@@ -215,6 +215,12 @@ StackFrameAMD64* StackwalkerAMD64::GetCallerByFramePointerRecovery(
return NULL;
}
+ // Sanity check that resulting rbp is still inside stack memory.
+ uint64_t unused;
+ if (!memory_->GetMemoryAtAddress(caller_rbp, &unused)) {
+ return NULL;
+ }
+
StackFrameAMD64* frame = new StackFrameAMD64();
frame->trust = StackFrame::FRAME_TRUST_FP;
frame->context = last_frame->context;
diff --git a/src/processor/stackwalker_amd64_unittest.cc b/src/processor/stackwalker_amd64_unittest.cc
index 935bef86..70fba11b 100644
--- a/src/processor/stackwalker_amd64_unittest.cc
+++ b/src/processor/stackwalker_amd64_unittest.cc
@@ -690,7 +690,8 @@ TEST_F(GetCallerFrame, CallerPushedRBP) {
// frame 1
.Mark(&frame1_sp)
.Append(32, 0) // body of frame1
- .Mark(&frame1_rbp); // end of stack
+ .Mark(&frame1_rbp) // end of stack
+ .D64(0);
RegionFromSection();
raw_context.rip = 0x00007400c0000200ULL;