[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

llvm-svn: 301347
This commit is contained in:
Petr Hosek 2017-04-25 18:56:33 +00:00
parent 9ebbe5bf2e
commit 86611a078f
3 changed files with 31 additions and 1 deletions

View File

@ -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

View 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;