diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-05-28 19:45:49 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-05-28 19:45:49 +0000 |
commit | a6d93fd73b82579ddd1ec9965f726e29b33c4bab (patch) | |
tree | 753cca1a5810568e4c4ef4f440f5a8e22c591b4d /llvm/tools | |
parent | 442b88b9ec50fe710b815776ecadfe2f509854a2 (diff) | |
download | bcm5719-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')
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 10 |
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)); |