diff options
author | Petr Hosek <phosek@chromium.org> | 2017-04-25 18:56:33 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-04-25 18:56:33 +0000 |
commit | 86611a078f1d9d16caf1951b22763fa322dcce73 (patch) | |
tree | 758c7b72dffe724393b9b8e3940f5df4d0a16390 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 9ebbe5bf2ed32001ce3fbdcabc3d3a6a2ffa5f93 (diff) | |
download | bcm5719-llvm-86611a078f1d9d16caf1951b22763fa322dcce73.tar.gz bcm5719-llvm-86611a078f1d9d16caf1951b22763fa322dcce73.zip |
[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
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 613d0643b43..18fa0e07408 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/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; |