]> granicus.if.org Git - llvm/commitdiff
[BitcodeReader] Check if we can create a null constant for type.
authorFlorian Hahn <flo@fhahn.com>
Wed, 21 Aug 2019 18:20:11 +0000 (18:20 +0000)
committerFlorian Hahn <flo@fhahn.com>
Wed, 21 Aug 2019 18:20:11 +0000 (18:20 +0000)
We cannot create null constants for certain types, e.g. VoidTy,
FunctionTy or LabelTy. getNullValue asserts if we pass in an
unsupported type. We should also check for opaque types, but I'm not
sure how.

This fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14795.

Reviewers: t.p.northover, jfb, vsk

Reviewed By: vsk

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65897

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

lib/Bitcode/Reader/BitcodeReader.cpp
test/Bitcode/invalid-type-for-null-constant.ll [new file with mode: 0644]
test/Bitcode/invalid-type-for-null-constant.ll.bc [new file with mode: 0644]

index 32ae4cd9956986e60b610291eb01b8903db613c5..af906071225bfca875c60fe08511aca4692b5209 100644 (file)
@@ -2377,6 +2377,8 @@ Error BitcodeReader::parseConstants() {
       CurTy = flattenPointerTypes(CurFullTy);
       continue;  // Skip the ValueList manipulation.
     case bitc::CST_CODE_NULL:      // NULL
+      if (CurTy->isVoidTy() || CurTy->isFunctionTy() || CurTy->isLabelTy())
+        return error("Invalid type for a constant null value");
       V = Constant::getNullValue(CurTy);
       break;
     case bitc::CST_CODE_INTEGER:   // INTEGER: [intval]
diff --git a/test/Bitcode/invalid-type-for-null-constant.ll b/test/Bitcode/invalid-type-for-null-constant.ll
new file mode 100644 (file)
index 0000000..28756fa
--- /dev/null
@@ -0,0 +1,6 @@
+; Bitcode with a CST_CODE_NULL with void type.
+
+; RUN: not llvm-dis %s.bc -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid type for a constant null value
+
diff --git a/test/Bitcode/invalid-type-for-null-constant.ll.bc b/test/Bitcode/invalid-type-for-null-constant.ll.bc
new file mode 100644 (file)
index 0000000..6196ebc
Binary files /dev/null and b/test/Bitcode/invalid-type-for-null-constant.ll.bc differ