Don't assert if materializing before seeing any function bodies
authorFilipe Cabecinhas <me@filcab.net>
Thu, 29 Oct 2015 23:37:28 +0000 (23:37 +0000)
committerFilipe Cabecinhas <me@filcab.net>
Thu, 29 Oct 2015 23:37:28 +0000 (23:37 +0000)
This assert was reachable from user input. A minimized test case (no
FUNCTION_BLOCK_ID record) is attached.

Bug found with afl-fuzz

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251667 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bitcode/Reader/BitcodeReader.cpp
test/Bitcode/Inputs/invalid-no-function-block.bc [new file with mode: 0644]
test/Bitcode/invalid.test

index e23f817..d2cbe9e 100644 (file)
@@ -3054,7 +3054,9 @@ std::error_code BitcodeReader::rememberAndSkipFunctionBodies() {
 
   if (Stream.AtEndOfStream()) return error("Could not find function in stream");
 
-  assert(SeenFirstFunctionBody);
+  if (!SeenFirstFunctionBody)
+    return error("Trying to materialize functions before seeing function blocks");
+
   // An old bitcode file with the symbol table at the end would have
   // finished the parse greedily.
   assert(SeenValueSymbolTable);
diff --git a/test/Bitcode/Inputs/invalid-no-function-block.bc b/test/Bitcode/Inputs/invalid-no-function-block.bc
new file mode 100644 (file)
index 0000000..52b6558
Binary files /dev/null and b/test/Bitcode/Inputs/invalid-no-function-block.bc differ
index 6910404..24ccd8b 100644 (file)
@@ -207,3 +207,8 @@ RUN: not llvm-dis -disable-output %p/Inputs/invalid-alias-type-mismatch.bc 2>&1
 RUN:   FileCheck --check-prefix=ALIAS-TYPE-MISMATCH %s
 
 ALIAS-TYPE-MISMATCH: Alias and aliasee types don't match
+
+RUN: not llvm-dis -disable-output %p/Inputs/invalid-no-function-block.bc 2>&1 | \
+RUN:   FileCheck --check-prefix=NO-FUNCTION-BLOCK %s
+
+NO-FUNCTION-BLOCK: Trying to materialize functions before seeing function blocks