Merge "Fix crash in libunwindstack."

This commit is contained in:
Treehugger Robot 2019-01-25 04:29:30 +00:00 committed by Gerrit Code Review
commit 8306597e8f
2 changed files with 18 additions and 1 deletions

View file

@ -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();
}

View file

@ -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(), &regs_, 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));