diff --git a/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp @@ -29,13 +29,13 @@ uint8_t OffsetByteSize = Format == dwarf::DWARF64 ? 8 : 4; uint64_t FullLength = HeaderData.Length + dwarf::getUnitLengthFieldByteSize(Format); - assert(FullLength == length()); if (FullLength < getHeaderSize(Format)) return createStringError(errc::invalid_argument, "%s table at offset 0x%" PRIx64 " has too small length (0x%" PRIx64 ") to contain a complete header", SectionName.data(), HeaderOffset, FullLength); + assert(FullLength == length() && "Inconsistent calculation of length."); uint64_t End = HeaderOffset + FullLength; if (!Data.isValidOffsetForDataOfSize(HeaderOffset, FullLength)) return createStringError(errc::invalid_argument, diff --git a/llvm/test/DebugInfo/X86/dwarfdump-rnglists-zero-length.s b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-zero-length.s new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-zero-length.s @@ -0,0 +1,12 @@ +## The test checks that llvm-dwarfdump can handle a malformed input file without +## crashing. + +# RUN: llvm-mc -triple x86_64 %s -filetype=obj -o %t +# RUN: not llvm-dwarfdump -debug-rnglists %t 2>&1 | FileCheck %s + +# CHECK: error: .debug_rnglists table at offset 0x0 has too small length (0x4) to contain a complete header + +## An assertion used to trigger in the debug build of the DebugInfo/DWARF +## library if the unit length field in a range list table was 0. + .section .debug_rnglists,"",@progbits + .long 0