Index: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
index 7332761b3e1c88b41f3355efea479d1e41ed2d25..a201601ce9d98b90f4bf93bcfadf2ea0d40b8161 100644 |
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
@@ -328,33 +328,45 @@ bool NaClBitcodeReader::ParseTypeTableBody() { |
StrM.flush(); |
return Error(Message); |
} |
+ |
case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] |
// TYPE_CODE_NUMENTRY contains a count of the number of types in the |
// type list. This allows us to reserve space. |
- if (Record.size() < 1) |
+ if (Record.size() != 1) |
return Error("Invalid TYPE_CODE_NUMENTRY record"); |
TypeList.resize(Record[0]); |
+ // No type was defined, skip the checks that follow the switch. |
continue; |
- case naclbitc::TYPE_CODE_VOID: // VOID |
+ |
+ case naclbitc::TYPE_CODE_VOID: // VOID |
+ if (Record.size() != 0) |
+ return Error("Invalid TYPE_CODE_VOID record"); |
ResultTy = Type::getVoidTy(Context); |
break; |
- case naclbitc::TYPE_CODE_FLOAT: // FLOAT |
+ |
+ case naclbitc::TYPE_CODE_FLOAT: // FLOAT |
+ if (Record.size() != 0) |
+ return Error("Invalid TYPE_CODE_FLOAT record"); |
ResultTy = Type::getFloatTy(Context); |
break; |
- case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE |
+ |
+ case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE |
+ if (Record.size() != 0) |
+ return Error("Invalid TYPE_CODE_DOUBLE record"); |
ResultTy = Type::getDoubleTy(Context); |
break; |
- case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] |
- if (Record.size() < 1) |
- return Error("Invalid Integer type record"); |
+ case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] |
+ if (Record.size() != 1) |
+ return Error("Invalid TYPE_CODE_INTEGER record"); |
ResultTy = IntegerType::get(Context, Record[0]); |
break; |
+ |
case naclbitc::TYPE_CODE_FUNCTION: { |
// FUNCTION: [vararg, retty, paramty x N] |
if (Record.size() < 2) |
- return Error("Invalid FUNCTION type record"); |
- SmallVector<Type*, 8> ArgTys; |
+ return Error("Invalid TYPE_CODE_FUNCTION record"); |
+ SmallVector<Type *, 8> ArgTys; |
for (unsigned i = 2, e = Record.size(); i != e; ++i) { |
if (Type *T = getTypeByID(Record[i])) |
ArgTys.push_back(T); |
@@ -363,7 +375,7 @@ bool NaClBitcodeReader::ParseTypeTableBody() { |
} |
ResultTy = getTypeByID(Record[1]); |
- if (ResultTy == 0 || ArgTys.size() < Record.size()-2) |
+ if (ResultTy == 0 || ArgTys.size() < Record.size() - 2) |
return Error("invalid type in function type"); |
ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
@@ -1074,7 +1086,7 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
} |
case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] |
- if (Record.size() < 1 || Record[0] == 0) |
+ if (Record.size() != 1 || Record[0] == 0) |
return Error("Invalid DECLAREBLOCKS record"); |
// Create all the basic blocks for the function. |
FunctionBBs.resize(Record[0]); |
@@ -1144,7 +1156,8 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
Value *TrueVal, *FalseVal, *Cond; |
if (popValue(Record, &OpNum, NextValueNo, &TrueVal) || |
popValue(Record, &OpNum, NextValueNo, &FalseVal) || |
- popValue(Record, &OpNum, NextValueNo, &Cond)) |
+ popValue(Record, &OpNum, NextValueNo, &Cond) || |
+ OpNum != Record.size()) |
return Error("Invalid SELECT record"); |
TrueVal = ConvertOpToScalar(TrueVal, CurBBNo); |
@@ -1317,9 +1330,8 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
unsigned OpNum = 0; |
Value *Val, *Ptr; |
if (popValue(Record, &OpNum, NextValueNo, &Ptr) || |
- popValue(Record, &OpNum, NextValueNo, &Val)) |
- return Error("Invalid STORE record"); |
- if (OpNum+1 != Record.size()) |
+ popValue(Record, &OpNum, NextValueNo, &Val) || |
+ OpNum+1 != Record.size()) |
return Error("Invalid STORE record"); |
Val = ConvertOpToScalar(Val, CurBBNo); |
Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBBNo); |