]> granicus.if.org Git - llvm/commitdiff
[llvm-objdump] Don't attempt to print lines beyond the end of file
authorPetr Hosek <phosek@chromium.org>
Tue, 25 Apr 2017 18:56:33 +0000 (18:56 +0000)
committerPetr Hosek <phosek@chromium.org>
Tue, 25 Apr 2017 18:56:33 +0000 (18:56 +0000)
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

test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 [new file with mode: 0644]
test/tools/llvm-objdump/X86/debug-info-fileinfo.test [new file with mode: 0644]
tools/llvm-objdump/llvm-objdump.cpp

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 (file)
index 0000000..2074886
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 (file)
index 0000000..2c51e0b
--- /dev/null
@@ -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
index 613d0643b43357e0ea8c823b9b52d05cacdb1e9f..18fa0e0740849ce6273e5f2efb23720989b9aa80 100644 (file)
@@ -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;