[llvm] 100483b - [DWARFDebugLine] Check for (EOF) errors when parsing v5 content descriptors
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 14 07:03:07 PDT 2020
Author: Pavel Labath
Date: 2020-04-14T16:02:56+02:00
New Revision: 100483b969b816e71cdfadfc591203c77e3e3fc7
URL: https://github.com/llvm/llvm-project/commit/100483b969b816e71cdfadfc591203c77e3e3fc7
DIFF: https://github.com/llvm/llvm-project/commit/100483b969b816e71cdfadfc591203c77e3e3fc7.diff
LOG: [DWARFDebugLine] Check for (EOF) errors when parsing v5 content descriptors
Summary:
Without that we could be silently reading zeroes, as that's the default
DataExtractor behavior. The entire parse would still most likely fail,
but it would do that with a seemingly unrelated/nonsensical error
message.
Reviewers: dblaikie, probinson, jhenderson
Subscribers: hiraditya, MaskRay, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D77554
Added:
llvm/test/tools/llvm-dwarfdump/X86/debug_line_short_prologue.s
Modified:
llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
index 366f0479c93a..bd1954a73e1d 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
@@ -219,14 +219,15 @@ parseV2DirFileTables(const DWARFDataExtractor &DebugLineData,
static llvm::Expected<ContentDescriptors>
parseV5EntryFormat(const DWARFDataExtractor &DebugLineData, uint64_t *OffsetPtr,
DWARFDebugLine::ContentTypeTracker *ContentTypes) {
+ Error Err = Error::success();
ContentDescriptors Descriptors;
- int FormatCount = DebugLineData.getU8(OffsetPtr);
+ int FormatCount = DebugLineData.getU8(OffsetPtr, &Err);
bool HasPath = false;
- for (int I = 0; I != FormatCount; ++I) {
+ for (int I = 0; I != FormatCount && !Err; ++I) {
ContentDescriptor Descriptor;
Descriptor.Type =
- dwarf::LineNumberEntryFormat(DebugLineData.getULEB128(OffsetPtr));
- Descriptor.Form = dwarf::Form(DebugLineData.getULEB128(OffsetPtr));
+ dwarf::LineNumberEntryFormat(DebugLineData.getULEB128(OffsetPtr, &Err));
+ Descriptor.Form = dwarf::Form(DebugLineData.getULEB128(OffsetPtr, &Err));
if (Descriptor.Type == dwarf::DW_LNCT_path)
HasPath = true;
if (ContentTypes)
@@ -234,6 +235,11 @@ parseV5EntryFormat(const DWARFDataExtractor &DebugLineData, uint64_t *OffsetPtr,
Descriptors.push_back(Descriptor);
}
+ if (Err)
+ return createStringError(errc::invalid_argument,
+ "failed to parse entry content descriptors: %s",
+ toString(std::move(Err)).c_str());
+
if (!HasPath)
return createStringError(errc::invalid_argument,
"failed to parse entry content descriptions"
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_line_short_prologue.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_line_short_prologue.s
new file mode 100644
index 000000000000..0bf4bc90d85d
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_line_short_prologue.s
@@ -0,0 +1,68 @@
+## Test cases when we run into the end of section while parsing a line table
+## prologue.
+
+# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj --defsym CASE=0 -o %t0
+# RUN: llvm-dwarfdump -debug-line %t0 2>&1 | FileCheck %s --check-prefixes=ALL,C0
+
+# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj --defsym CASE=1 -o %t1
+# RUN: llvm-dwarfdump -debug-line %t1 2>&1 | FileCheck %s --check-prefixes=ALL,C1
+
+# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj --defsym CASE=2 -o %t2
+# RUN: llvm-dwarfdump -debug-line %t2 2>&1 | FileCheck %s --check-prefixes=ALL,C2
+
+# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj --defsym CASE=3 -o %t3
+# RUN: llvm-dwarfdump -debug-line %t3 2>&1 | FileCheck %s --check-prefixes=ALL,OK
+
+# ALL: debug_line[0x00000000]
+# C0-NEXT: warning: parsing line table prologue at 0x00000000 found an invalid directory or file table description at 0x00000027
+# C0-NEXT: warning: failed to parse entry content descriptors: unexpected end of data at offset 0x27
+# C1-NEXT: warning: parsing line table prologue at 0x00000000 found an invalid directory or file table description at 0x0000002a
+# C1-NEXT: warning: failed to parse entry content descriptors: malformed uleb128, extends past end
+# C2-NEXT: warning: parsing line table prologue at 0x00000000 found an invalid directory or file table description at 0x0000002b
+# C2-NEXT: warning: failed to parse entry content descriptors: malformed uleb128, extends past end
+# ALL: include_directories[ 0] = "/tmp"
+# OK: file_names[ 0]:
+# OK-NEXT: name: "foo"
+# OK-NEXT: dir_index: 0
+
+.section .debug_line,"", at progbits
+.long .Lend-.Lstart # Length of Unit
+.Lstart:
+.short 5 # DWARF version number
+.byte 8 # Address Size
+.byte 0 # Segment Selector Size
+.long .Lprologue_end-.Lprologue_start # Length of Prologue
+.Lprologue_start:
+.byte 1 # Minimum Instruction Length
+.byte 1 # Maximum Operations per Instruction
+.byte 1 # Default is_stmt
+.byte -5 # Line Base
+.byte 14 # Line Range
+.byte 13 # Opcode Base
+.byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # Standard Opcode Lengths
+# Directory table format
+.byte 1 # One element per directory entry
+.byte 1 # DW_LNCT_path
+.byte 0x08 # DW_FORM_string
+# Directory table entries
+.byte 1 # 1 directory
+.asciz "/tmp"
+# File table format
+.if CASE >= 1
+.byte 2 # 2 elements per file entry
+.byte 1 # DW_LNCT_path
+.byte 8 # DW_FORM_string
+.if CASE >= 2
+.byte 2 # DW_LNCT_directory_index
+.if CASE >= 3
+.byte 11 # DW_FORM_data1
+# File table entries
+.byte 1
+.asciz "foo"
+.byte 0
+.endif
+.endif
+.endif
+
+.Lprologue_end:
+.Lend:
More information about the llvm-commits
mailing list