From d96cbae4d483cf0422a0d879969ac1fee072aca1 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 8 Nov 2017 11:01:18 -0800 Subject: [PATCH] Fix another nullptr dereference. In this case, if the .eh_frame_hdr doesn't exist, we would crash. Bug: 68813077 Test: Pass new unit tests, verified that without the fix, the unit test Test: would crash. Change-Id: I4f1365a76fe5c2fb69fa106a1ef15889c14e7611 --- libunwindstack/DwarfEhFrameWithHdr.cpp | 6 ++++++ .../tests/DwarfEhFrameWithHdrTest.cpp | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libunwindstack/DwarfEhFrameWithHdr.cpp b/libunwindstack/DwarfEhFrameWithHdr.cpp index d8cbdf439..0337dbaac 100644 --- a/libunwindstack/DwarfEhFrameWithHdr.cpp +++ b/libunwindstack/DwarfEhFrameWithHdr.cpp @@ -115,6 +115,9 @@ bool DwarfEhFrameWithHdr::GetFdeOffsetBinary(uint64_t pc, uint64_t* while (first < last) { size_t current = (first + last) / 2; const FdeInfo* info = GetFdeInfoFromIndex(current); + if (info == nullptr) { + return false; + } if (pc == info->pc) { *fde_offset = info->offset; return true; @@ -127,6 +130,9 @@ bool DwarfEhFrameWithHdr::GetFdeOffsetBinary(uint64_t pc, uint64_t* } if (last != 0) { const FdeInfo* info = GetFdeInfoFromIndex(last - 1); + if (info == nullptr) { + return false; + } *fde_offset = info->offset; return true; } diff --git a/libunwindstack/tests/DwarfEhFrameWithHdrTest.cpp b/libunwindstack/tests/DwarfEhFrameWithHdrTest.cpp index 7c8fc6cc4..1028ab9fe 100644 --- a/libunwindstack/tests/DwarfEhFrameWithHdrTest.cpp +++ b/libunwindstack/tests/DwarfEhFrameWithHdrTest.cpp @@ -205,6 +205,14 @@ TYPED_TEST_P(DwarfEhFrameWithHdrTest, GetFdeOffsetBinary_verify) { } } +TYPED_TEST_P(DwarfEhFrameWithHdrTest, GetFdeOffsetBinary_index_fail) { + this->eh_frame_->TestSetTableEntrySize(0x10); + this->eh_frame_->TestSetFdeCount(10); + + uint64_t fde_offset; + EXPECT_FALSE(this->eh_frame_->GetFdeOffsetBinary(0x1000, &fde_offset, 10)); +} + TYPED_TEST_P(DwarfEhFrameWithHdrTest, GetFdeOffsetSequential) { this->eh_frame_->TestSetFdeCount(10); this->eh_frame_->TestSetEntriesDataOffset(0x100); @@ -414,10 +422,11 @@ TYPED_TEST_P(DwarfEhFrameWithHdrTest, GetFdeFromPc_fde_not_found) { REGISTER_TYPED_TEST_CASE_P(DwarfEhFrameWithHdrTest, Init, GetFdeInfoFromIndex_expect_cache_fail, GetFdeInfoFromIndex_read_pcrel, GetFdeInfoFromIndex_read_datarel, GetFdeInfoFromIndex_cached, GetFdeOffsetBinary_verify, - GetFdeOffsetSequential, GetFdeOffsetSequential_last_element, - GetFdeOffsetSequential_end_check, GetFdeOffsetFromPc_fail_fde_count, - GetFdeOffsetFromPc_binary_search, GetFdeOffsetFromPc_sequential_search, - GetCieFde32, GetCieFde64, GetFdeFromPc_fde_not_found); + GetFdeOffsetBinary_index_fail, GetFdeOffsetSequential, + GetFdeOffsetSequential_last_element, GetFdeOffsetSequential_end_check, + GetFdeOffsetFromPc_fail_fde_count, GetFdeOffsetFromPc_binary_search, + GetFdeOffsetFromPc_sequential_search, GetCieFde32, GetCieFde64, + GetFdeFromPc_fde_not_found); typedef ::testing::Types DwarfEhFrameWithHdrTestTypes; INSTANTIATE_TYPED_TEST_CASE_P(, DwarfEhFrameWithHdrTest, DwarfEhFrameWithHdrTestTypes);