Fix a crash in the LL parser where it failed to validate that the pointer operand...
authorOwen Anderson <resistor@mac.com>
Mon, 2 Mar 2015 05:25:06 +0000 (05:25 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 2 Mar 2015 05:25:06 +0000 (05:25 +0000)
This manifested as an assertion failure in +Asserts builds, and a hard crash in -Asserts builds.  Found by fuzzing the LL parser.

llvm-svn: 230934

llvm/lib/AsmParser/LLParser.cpp
llvm/test/Assembler/getelementptr_invalid_ptr.ll [new file with mode: 0644]

index 40563b5..d50da69 100644 (file)
@@ -5458,6 +5458,8 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
     return true;
 
   Type *PtrTy = Ptr->getType();
+  if (!isa<SequentialType>(PtrTy))
+    return Error(Loc, "pointer type is not valid");
   if (VectorType *VT = dyn_cast<VectorType>(PtrTy))
     PtrTy = VT->getElementType();
   if (Ty != cast<SequentialType>(PtrTy)->getElementType())
diff --git a/llvm/test/Assembler/getelementptr_invalid_ptr.ll b/llvm/test/Assembler/getelementptr_invalid_ptr.ll
new file mode 100644 (file)
index 0000000..8296dd3
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: not llvm-as < %s >/dev/null 2> %t
+; RUN: FileCheck %s < %t
+; Test the case of an invalid pointer type on a GEP
+
+; CHECK: pointer type is not valid
+
+define i32* @foo(i32 %a) {
+  %gep = getelementptr i32, i32 %a, i32 1
+  return i32* %gep
+}
+