[llvm] r301347 - [llvm-objdump] Don't attempt to print lines beyond the end of file

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 25 11:56:34 PDT 2017


Author: phosek
Date: Tue Apr 25 13:56:33 2017
New Revision: 301347

URL: http://llvm.org/viewvc/llvm-project?rev=301347&view=rev
Log:
[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

Added:
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64
    llvm/trunk/test/tools/llvm-objdump/X86/debug-info-fileinfo.test
Modified:
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64?rev=301347&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 (added) and llvm/trunk/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 Tue Apr 25 13:56:33 2017 differ

Added: llvm/trunk/test/tools/llvm-objdump/X86/debug-info-fileinfo.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/debug-info-fileinfo.test?rev=301347&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/debug-info-fileinfo.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/debug-info-fileinfo.test Tue Apr 25 13:56:33 2017
@@ -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

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=301347&r1=301346&r2=301347&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Tue Apr 25 13:56:33 2017
@@ -485,10 +485,13 @@ void SourcePrinter::printSourceLine(raw_
     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;




More information about the llvm-commits mailing list