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

Commit 8306597e authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Fix crash in libunwindstack."

parents 9ffdf594 c479e4e7
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));