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

Commit 3e65f6b8 authored by Christopher Ferris's avatar Christopher Ferris Committed by android-build-merger
Browse files

Merge "Fix problem adding too many frames." am: 9074871a am: 19009e03

am: c1153006

Change-Id: Ia279729b505f806014cb494bfa70c4e072fb2cd5
parents 1e8187f2 c1153006
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -190,6 +190,12 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
        FillInDexFrame();
        // Clear the dex pc so that we don't repeat this frame later.
        regs_->set_dex_pc(0);

        // Make sure there is enough room for the real frame.
        if (frames_.size() == max_frames_) {
          last_error_.code = ERROR_MAX_FRAMES_EXCEEDED;
          break;
        }
      }

      FillInFrame(map_info, elf, rel_pc, step_pc, pc_adjustment);
+27 −0
Original line number Diff line number Diff line
@@ -946,6 +946,33 @@ TEST_F(UnwinderTest, dex_pc_multiple_frames) {
  EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags);
}

TEST_F(UnwinderTest, dex_pc_max_frames) {
  ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0));
  regs_.set_pc(0x1000);
  regs_.set_sp(0x10000);
  regs_.FakeSetDexPc(0xa3400);

  Unwinder unwinder(1, &maps_, &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode());

  ASSERT_EQ(1U, unwinder.NumFrames());

  auto* frame = &unwinder.frames()[0];
  EXPECT_EQ(0U, frame->num);
  EXPECT_EQ(0x400U, frame->rel_pc);
  EXPECT_EQ(0xa3400U, frame->pc);
  EXPECT_EQ(0x10000U, frame->sp);
  EXPECT_EQ("", frame->function_name);
  EXPECT_EQ(0U, frame->function_offset);
  EXPECT_EQ("/fake/fake.vdex", frame->map_name);
  EXPECT_EQ(0U, frame->map_offset);
  EXPECT_EQ(0xa3000U, frame->map_start);
  EXPECT_EQ(0xa4000U, frame->map_end);
  EXPECT_EQ(0U, frame->map_load_bias);
  EXPECT_EQ(PROT_READ | PROT_WRITE | PROT_EXEC, frame->map_flags);
}

// Verify format frame code.
TEST_F(UnwinderTest, format_frame_static) {
  FrameData frame;