Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95f94078 authored by Florian Mayer's avatar Florian Mayer Committed by android-build-merger
Browse files

Merge "Fix crash in libunwindstack."

am: 8306597e

Change-Id: Iead0e058dd15d70ac9ccc58794119283df41c419
parents 73b67bb4 8306597e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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();
        }
+17 −0
Original line number Diff line number Diff line
@@ -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));