Skip to content

Commit

Permalink
[llvm/DebugInfo] Fix invalid verifier error for DWARF5
Browse files Browse the repository at this point in the history
We unconditionally compared the DW_AT_ranges offset to the length of the
.debug_ranges section. For DWARF5 we should look at the debug_rnglists
section instead.

Differential revision: https://reviews.llvm.org/D78971
  • Loading branch information
JDevlieghere committed Apr 28, 2020
1 parent cbaa74a commit 3e4a16d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
12 changes: 9 additions & 3 deletions llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
Expand Up @@ -457,9 +457,15 @@ unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die,
case DW_AT_ranges:
// Make sure the offset in the DW_AT_ranges attribute is valid.
if (auto SectionOffset = AttrValue.Value.getAsSectionOffset()) {
if (*SectionOffset >= DObj.getRangesSection().Data.size())
ReportError("DW_AT_ranges offset is beyond .debug_ranges bounds: " +
llvm::formatv("{0:x8}", *SectionOffset));
unsigned DwarfVersion = Die.getDwarfUnit()->getVersion();
const DWARFSection &RangeSection = DwarfVersion < 5
? DObj.getRangesSection()
: DObj.getRnglistsSection();
if (*SectionOffset >= RangeSection.Data.size())
ReportError(
"DW_AT_ranges offset is beyond " +
StringRef(DwarfVersion < 5 ? ".debug_ranges" : ".debug_rnglists") +
" bounds: " + llvm::formatv("{0:x8}", *SectionOffset));
break;
}
ReportError("DIE has invalid DW_AT_ranges encoding:");
Expand Down
38 changes: 38 additions & 0 deletions llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
Expand Up @@ -2013,6 +2013,44 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInvalidRanges) {
"error: DW_AT_ranges offset is beyond .debug_ranges bounds: 0x00001000");
}

TEST(DWARFDebugInfo, TestDwarfVerifyInvalidRnglists) {
// Create a single compile unit with a DW_AT_ranges whose section offset
// isn't valid.
const char *yamldata = R"(
debug_str:
- ''
- /tmp/main.c
debug_abbrev:
- Code: 0x00000001
Tag: DW_TAG_compile_unit
Children: DW_CHILDREN_no
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_strp
- Attribute: DW_AT_ranges
Form: DW_FORM_sec_offset
debug_info:
- Length:
TotalLength: 17
Version: 5
UnitType: DW_UT_compile
AbbrOffset: 0
AddrSize: 8
Entries:
- AbbrCode: 0x00000001
Values:
- Value: 0x0000000000000001
- Value: 0x0000000000001000
)";
auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
ASSERT_TRUE((bool)ErrOrSections);
std::unique_ptr<DWARFContext> DwarfContext =
DWARFContext::create(*ErrOrSections, 8);
VerifyError(*DwarfContext, "error: DW_AT_ranges offset is beyond "
".debug_rnglists bounds: 0x00001000");
}

TEST(DWARFDebugInfo, TestDwarfVerifyInvalidStmtList) {
// Create a single compile unit with a DW_AT_stmt_list whose section offset
// isn't valid.
Expand Down

0 comments on commit 3e4a16d

Please sign in to comment.