[BitcodeReader] Change an assert to a call to a call to Error()
authorFilipe Cabecinhas <me@filcab.net>
Sat, 30 May 2015 00:17:20 +0000 (00:17 +0000)
committerFilipe Cabecinhas <me@filcab.net>
Sat, 30 May 2015 00:17:20 +0000 (00:17 +0000)
It's reachable from user input.

Bug found with AFL fuzz.

llvm-svn: 238633

llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/test/Bitcode/Inputs/invalid-metadata-not-followed-named-node.bc [new file with mode: 0644]
llvm/test/Bitcode/invalid.test

index 441a4c7..4044ac8 100644 (file)
@@ -1634,9 +1634,9 @@ std::error_code BitcodeReader::ParseMetadata() {
       Record.clear();
       Code = Stream.ReadCode();
 
-      // METADATA_NAME is always followed by METADATA_NAMED_NODE.
       unsigned NextBitCode = Stream.readRecord(Code, Record);
-      assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode;
+      if (NextBitCode != bitc::METADATA_NAMED_NODE)
+        return Error("METADATA_NAME not followed by METADATA_NAMED_NODE");
 
       // Read named metadata elements.
       unsigned Size = Record.size();
diff --git a/llvm/test/Bitcode/Inputs/invalid-metadata-not-followed-named-node.bc b/llvm/test/Bitcode/Inputs/invalid-metadata-not-followed-named-node.bc
new file mode 100644 (file)
index 0000000..42a2c3e
Binary files /dev/null and b/llvm/test/Bitcode/Inputs/invalid-metadata-not-followed-named-node.bc differ
index eb7f979..43f7c77 100644 (file)
@@ -187,3 +187,8 @@ RUN: not llvm-dis -disable-output %p/Inputs/invalid-array-operand-encoding.bc 2>
 RUN:   FileCheck --check-prefix=ARRAY-OP-ENC %s
 
 ARRAY-OP-ENC: Array element type has to be an encoding of a type
+
+RUN: not llvm-dis -disable-output %p/Inputs/invalid-metadata-not-followed-named-node.bc 2>&1 | \
+RUN:   FileCheck --check-prefix=META-NOT-FOLLOWED-BY-NAMED-META %s
+
+META-NOT-FOLLOWED-BY-NAMED-META: METADATA_NAME not followed by METADATA_NAMED_NODE