summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/COFFDumper.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-05-28 19:45:49 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-05-28 19:45:49 +0000
commita6d93fd73b82579ddd1ec9965f726e29b33c4bab (patch)
tree753cca1a5810568e4c4ef4f440f5a8e22c591b4d /llvm/tools/llvm-readobj/COFFDumper.cpp
parent442b88b9ec50fe710b815776ecadfe2f509854a2 (diff)
downloadbcm5719-llvm-a6d93fd73b82579ddd1ec9965f726e29b33c4bab.tar.gz
bcm5719-llvm-a6d93fd73b82579ddd1ec9965f726e29b33c4bab.zip
[llvm-readobj] Validate the string table offset before using it
llvm-svn: 271139
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index 642b2847b6d..8bad24baf9a 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -794,14 +794,20 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName,
while (!Contents.empty()) {
const FrameData *FD;
error(consumeObject(Contents, FD));
+
+ if (FD->FrameFunc >= CVStringTable.size())
+ error(object_error::parse_failed);
+
+ StringRef FrameFunc =
+ CVStringTable.drop_front(FD->FrameFunc).split('\0').first;
+
DictScope S(W, "FrameData");
W.printHex("RvaStart", FD->RvaStart);
W.printHex("CodeSize", FD->CodeSize);
W.printHex("LocalSize", FD->LocalSize);
W.printHex("ParamsSize", FD->ParamsSize);
W.printHex("MaxStackSize", FD->MaxStackSize);
- W.printString("FrameFunc",
- CVStringTable.drop_front(FD->FrameFunc).split('\0').first);
+ W.printString("FrameFunc", FrameFunc);
W.printHex("PrologSize", FD->PrologSize);
W.printHex("SavedRegsSize", FD->SavedRegsSize);
W.printFlags("Flags", FD->Flags, makeArrayRef(FrameDataFlags));
OpenPOWER on IntegriCloud