Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index 763ff486eff0d804e4d98bde5d6de5832c4bfe92..a7da25a63953d26dc13dcdfbe37fa1a063ea7b19 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -230,6 +230,25 @@ bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { |
bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { |
StackFrame::State state; |
+ if (frame->is_entry() || frame->is_entry_construct()) { |
+ // See EntryFrame::GetCallerState. It computes the caller FP address |
+ // and calls ExitFrame::GetStateForFramePointer on it. We need to be |
+ // sure that caller FP address is valid. |
+ Address caller_fp = Memory::Address_at( |
+ frame->fp() + EntryFrameConstants::kCallerFPOffset); |
+ if (!IsValidStackAddress(caller_fp)) { |
+ return false; |
+ } |
+ } else if (frame->is_arguments_adaptor()) { |
+ // See ArgumentsAdaptorFrame::GetCallerStackPointer. It assumes that |
+ // the number of arguments is stored on stack as Smi. We need to check |
+ // that it really an Smi. |
+ Object* number_of_args = reinterpret_cast<ArgumentsAdaptorFrame*>(frame)-> |
+ GetExpression(0); |
+ if (!number_of_args->IsSmi()) { |
+ return false; |
+ } |
+ } |
frame->ComputeCallerState(&state); |
return IsValidStackAddress(state.sp) && IsValidStackAddress(state.fp) && |
iterator_.SingletonFor(frame->GetCallerState(&state)) != NULL; |