From: Petr Hosek Date: Tue, 25 Apr 2017 18:56:33 +0000 (+0000) Subject: [llvm-objdump] Don't attempt to print lines beyond the end of file X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10cfd77597d14ce8644f419f8cbc36b6cdc56862;p=llvm [llvm-objdump] Don't attempt to print lines beyond the end of file This may trigger a segfault in llvm-objdump when the line number stored in debug infromation points beyond the end of file; lines in LineBuffer are stored in std::vector which is allocated in chunks, so even if the debug info points beyond the end of the file, this doesn't necessarily trigger the segfault unless the line number points beyond the allocated space. Differential Revision: https://reviews.llvm.org/D32466 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301347 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 b/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 new file mode 100644 index 00000000000..2074886c665 Binary files /dev/null and b/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 differ diff --git a/test/tools/llvm-objdump/X86/debug-info-fileinfo.test b/test/tools/llvm-objdump/X86/debug-info-fileinfo.test new file mode 100644 index 00000000000..2c51e0beda4 --- /dev/null +++ b/test/tools/llvm-objdump/X86/debug-info-fileinfo.test @@ -0,0 +1,27 @@ +# Check that debug info line number pointing beyond the end of the file +# doesn't cause a segmentation fault in llvm-objdump. + +# To rebuild the input: clang -g debug-info-fileinfo.S -o debug-info-fileinfo.exe -nostdlib + +# RUN: llvm-objdump -S %p/Inputs/debug-info-fileinfo.exe.elf-x86_64 | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK: _start +# CHECK-NEXT: 400078: c3 retq +# CHECK: foo +# CHECK-NEXT: 400079: 90 nop +# CHECK-NEXT: 40007a: 90 nop +# CHECK-NEXT: 40007b: c3 retq + +.text + +.global _start; .type _start, STT_FUNC; _start: + ret + +.global foo; .type foo, STT_FUNC; foo: + # foo + # bar + # baz + nop + nop + ret diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 613d0643b43..18fa0e07408 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -485,10 +485,13 @@ void SourcePrinter::printSourceLine(raw_ostream &OS, uint64_t Address, auto FileBuffer = SourceCache.find(LineInfo.FileName); if (FileBuffer != SourceCache.end()) { auto LineBuffer = LineCache.find(LineInfo.FileName); - if (LineBuffer != LineCache.end()) + if (LineBuffer != LineCache.end()) { + if (LineInfo.Line > LineBuffer->second.size()) + return; // Vector begins at 0, line numbers are non-zero OS << Delimiter << LineBuffer->second[LineInfo.Line - 1].ltrim() << "\n"; + } } } OldLineInfo = LineInfo;