Skip to content

Commit

Permalink
[DebugInfo] Don't crash when given invalid DWARFv5 line table prologue.
Browse files Browse the repository at this point in the history
This patch replaces an assertion with an explicit check for the validity
of the FORM parameters. The assertion was triggered when the DWARFv5
line table contained a zero address size.

This fixes OSS-Fuzz Issue 4644
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644

Differential revision: https://reviews.llvm.org/D41615

llvm-svn: 321863
  • Loading branch information
JDevlieghere committed Jan 5, 2018
1 parent 1ad085b commit cbf651f
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 7 deletions.
2 changes: 2 additions & 0 deletions llvm/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
Expand Up @@ -50,6 +50,8 @@ struct DWARFFormParams {
}
llvm_unreachable("Invalid Format value");
}

explicit operator bool() const { return Version && AddrSize; }
};

class DWARFFormValue {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
Expand Up @@ -268,7 +268,7 @@ bool DWARFDebugLine::Prologue::parse(const DWARFDataExtractor &DebugLineData,

if (getVersion() >= 5) {
if (!parseV5DirFileTables(DebugLineData, OffsetPtr, EndPrologueOffset,
getFormParams(), U, HasMD5, IncludeDirectories,
FormParams, U, HasMD5, IncludeDirectories,
FileNames)) {
fprintf(stderr,
"warning: parsing line table prologue at 0x%8.8" PRIx64
Expand Down
15 changes: 9 additions & 6 deletions llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp
Expand Up @@ -64,8 +64,9 @@ DWARFFormValue::getFixedByteSize(dwarf::Form Form,
const DWARFFormParams Params) {
switch (Form) {
case DW_FORM_addr:
assert(Params.Version && Params.AddrSize && "Invalid Params for form");
return Params.AddrSize;
if (Params)
return Params.AddrSize;
return None;

case DW_FORM_block: // ULEB128 length L followed by L bytes.
case DW_FORM_block1: // 1 byte length L followed by L bytes.
Expand All @@ -86,8 +87,9 @@ DWARFFormValue::getFixedByteSize(dwarf::Form Form,
return None;

case DW_FORM_ref_addr:
assert(Params.Version && Params.AddrSize && "Invalid Params for form");
return Params.getRefAddrByteSize();
if (Params)
return Params.getRefAddrByteSize();
return None;

case DW_FORM_flag:
case DW_FORM_data1:
Expand Down Expand Up @@ -118,8 +120,9 @@ DWARFFormValue::getFixedByteSize(dwarf::Form Form,
case DW_FORM_line_strp:
case DW_FORM_sec_offset:
case DW_FORM_strp_sup:
assert(Params.Version && Params.AddrSize && "Invalid Params for form");
return Params.getDwarfOffsetByteSize();
if (Params)
return Params.getDwarfOffsetByteSize();
return None;

case DW_FORM_data8:
case DW_FORM_ref8:
Expand Down
Binary file added llvm/test/DebugInfo/Inputs/invalid.linetable
Binary file not shown.
5 changes: 5 additions & 0 deletions llvm/test/DebugInfo/dwarfdump-invalid-line-table.test
@@ -0,0 +1,5 @@
Verify that dwarfdump doesn't crash on invalid line table prologue.
OSS-Fuzz Issue 4644 (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644)

RUN: llvm-dwarfdump --verbose %p/Inputs/invalid.linetable 2>&1 | FileCheck %s --check-prefix=INVALID-LINE-TABLE
INVALID-LINE-TABLE: invalid directory or file table description

0 comments on commit cbf651f

Please sign in to comment.