Merge "Fix crash in libunwindstack."
This commit is contained in:
commit
8306597e8f
2 changed files with 18 additions and 1 deletions
|
@ -247,7 +247,7 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
|
|||
// or the pc in the first frame is in a valid map.
|
||||
// This allows for a case where the code jumps into the middle of
|
||||
// nowhere, but there is no other unwind information after that.
|
||||
if (frames_.size() != 2 || maps_->Find(frames_[0].pc) != nullptr) {
|
||||
if (frames_.size() > 2 || (frames_.size() > 0 && maps_->Find(frames_[0].pc) != nullptr)) {
|
||||
// Remove the speculative frame.
|
||||
frames_.pop_back();
|
||||
}
|
||||
|
|
|
@ -749,6 +749,23 @@ TEST_F(UnwinderTest, speculative_frame_not_removed_pc_bad) {
|
|||
EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags);
|
||||
}
|
||||
|
||||
// Verify that a speculative frame does not cause a crash when it wasn't
|
||||
// really added due to a filter.
|
||||
TEST_F(UnwinderTest, speculative_frame_check_with_no_frames) {
|
||||
regs_.set_pc(0x23000);
|
||||
regs_.set_sp(0x10000);
|
||||
regs_.FakeSetReturnAddress(0x23100);
|
||||
regs_.FakeSetReturnAddressValid(true);
|
||||
|
||||
Unwinder unwinder(64, maps_.get(), ®s_, process_memory_);
|
||||
|
||||
std::vector<std::string> skip_names{"libanother.so"};
|
||||
unwinder.Unwind(&skip_names);
|
||||
EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
|
||||
|
||||
ASSERT_EQ(0U, unwinder.NumFrames());
|
||||
}
|
||||
|
||||
// Verify that an unwind stops when a frame is in given suffix.
|
||||
TEST_F(UnwinderTest, map_ignore_suffixes) {
|
||||
ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0));
|
||||
|
|
Loading…
Reference in a new issue