diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 308986a588f42..c24dcf030deb7 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -2107,11 +2107,15 @@ Error BitcodeReader::parseGlobalValueSymbolTable() { if (!MaybeRecord) return MaybeRecord.takeError(); switch (MaybeRecord.get()) { - case bitc::VST_CODE_FNENTRY: // [valueid, offset] + case bitc::VST_CODE_FNENTRY: { // [valueid, offset] + unsigned ValueID = Record[0]; + if (ValueID >= ValueList.size() || !ValueList[ValueID]) + return error("Invalid value reference in symbol table"); setDeferredFunctionInfo(FuncBitcodeOffsetDelta, - cast(ValueList[Record[0]]), Record); + cast(ValueList[ValueID]), Record); break; } + } } } diff --git a/llvm/test/Bitcode/Inputs/invalid-value-symbol-table.bc b/llvm/test/Bitcode/Inputs/invalid-value-symbol-table.bc new file mode 100644 index 0000000000000..509133ef46cda Binary files /dev/null and b/llvm/test/Bitcode/Inputs/invalid-value-symbol-table.bc differ diff --git a/llvm/test/Bitcode/invalid.test b/llvm/test/Bitcode/invalid.test index 7dabafdb6d0c9..32f93ab160e99 100644 --- a/llvm/test/Bitcode/invalid.test +++ b/llvm/test/Bitcode/invalid.test @@ -266,3 +266,8 @@ RUN: not llvm-dis -disable-output %p/Inputs/unterminated-blob.bc 2>&1 | \ RUN: FileCheck --check-prefix=UNTERMINATED-BLOB %s UNTERMINATED-BLOB: Blob ends too soon + +RUN: not llvm-dis -disable-output %p/Inputs/invalid-value-symbol-table.bc 2>&1 | \ +RUN: FileCheck --check-prefix=INVALID-VALUE-SYMBOL-TABLE %s + +INVALID-VALUE-SYMBOL-TABLE: Invalid value reference in symbol table