<div dir="ltr">This patch is to fix PR18704.<div>Thanks</div><div>Karthik Bhat</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 27, 2014 at 5:38 PM, Karthik Bhat <span dir="ltr"><<a href="mailto:kv.bhat@samsung.com" target="_blank">kv.bhat@samsung.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: karthik<br>
Date: Thu Mar 27 07:08:23 2014<br>
New Revision: 204920<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=204920&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=204920&view=rev</a><br>
Log:<br>
All new elements except the last one initialized to NULL. Ideally, once parsing is complete, all elements should be non-NULL.<br>
To safe-guard BitcodeReader, this patch adds null check for all access to these list.<br>
Patch by Dinesh Dwivedi!<br>
<br>
Added:<br>
    llvm/trunk/test/Bitcode/pr18704.ll<br>
    llvm/trunk/test/Bitcode/pr18704.ll.bc   (with props)<br>
Modified:<br>
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=204920&r1=204919&r2=204920&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=204920&r1=204919&r2=204920&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Thu Mar 27 07:08:23 2014<br>
@@ -960,7 +960,7 @@ error_code BitcodeReader::ParseValueSymb<br>
       if (ConvertToString(Record, 1, ValueName))<br>
         return Error(InvalidRecord);<br>
       unsigned ValueID = Record[0];<br>
-      if (ValueID >= ValueList.size())<br>
+      if (ValueID >= ValueList.size() || !ValueList[ValueID])<br>
         return Error(InvalidRecord);<br>
       Value *V = ValueList[ValueID];<br>
<br>
@@ -1027,7 +1027,7 @@ error_code BitcodeReader::ParseMetadata(<br>
       unsigned Size = Record.size();<br>
       NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name);<br>
       for (unsigned i = 0; i != Size; ++i) {<br>
-        MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i]));<br>
+        MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i]));<br>
         if (MD == 0)<br>
           return Error(InvalidRecord);<br>
         NMD->addOperand(MD);<br>
@@ -1109,7 +1109,7 @@ error_code BitcodeReader::ResolveGlobalA<br>
       // Not ready to resolve this yet, it requires something later in the file.<br>
       GlobalInits.push_back(GlobalInitWorklist.back());<br>
     } else {<br>
-      if (Constant *C = dyn_cast<Constant>(ValueList[ValID]))<br>
+      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))<br>
         GlobalInitWorklist.back().first->setInitializer(C);<br>
       else<br>
         return Error(ExpectedConstant);<br>
@@ -1122,7 +1122,7 @@ error_code BitcodeReader::ResolveGlobalA<br>
     if (ValID >= ValueList.size()) {<br>
       AliasInits.push_back(AliasInitWorklist.back());<br>
     } else {<br>
-      if (Constant *C = dyn_cast<Constant>(ValueList[ValID]))<br>
+      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))<br>
         AliasInitWorklist.back().first->setAliasee(C);<br>
       else<br>
         return Error(ExpectedConstant);<br>
@@ -1135,7 +1135,7 @@ error_code BitcodeReader::ResolveGlobalA<br>
     if (ValID >= ValueList.size()) {<br>
       FunctionPrefixes.push_back(FunctionPrefixWorklist.back());<br>
     } else {<br>
-      if (Constant *C = dyn_cast<Constant>(ValueList[ValID]))<br>
+      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))<br>
         FunctionPrefixWorklist.back().first->setPrefixData(C);<br>
       else<br>
         return Error(ExpectedConstant);<br>
@@ -1195,7 +1195,7 @@ error_code BitcodeReader::ParseConstants<br>
     case bitc::CST_CODE_SETTYPE:   // SETTYPE: [typeid]<br>
       if (Record.empty())<br>
         return Error(InvalidRecord);<br>
-      if (Record[0] >= TypeList.size())<br>
+      if (Record[0] >= TypeList.size() || !TypeList[Record[0]])<br>
         return Error(InvalidRecord);<br>
       CurTy = TypeList[Record[0]];<br>
       continue;  // Skip the ValueList manipulation.<br>
@@ -3039,7 +3039,7 @@ OutOfRecordLoop:<br>
     if (A->getParent() == 0) {<br>
       // We found at least one unresolved value.  Nuke them all to avoid leaks.<br>
       for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){<br>
-        if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) {<br>
+        if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && A->getParent() == 0) {<br>
           A->replaceAllUsesWith(UndefValue::get(A->getType()));<br>
           delete A;<br>
         }<br>
<br>
Added: llvm/trunk/test/Bitcode/pr18704.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/pr18704.ll?rev=204920&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/pr18704.ll?rev=204920&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/test/Bitcode/pr18704.ll (added)<br>
+++ llvm/trunk/test/Bitcode/pr18704.ll Thu Mar 27 07:08:23 2014<br>
@@ -0,0 +1,158 @@<br>
+; RUN:  not llvm-dis < %s.bc 2>&1 | FileCheck %s<br>
+<br>
+; CHECK: llvm-dis{{(\.EXE|\.exe)?}}: Never resolved value found in function<br>
+<br>
+; pr18704.ll.bc has an instruction referring to invalid type.<br>
+; The test checks that LLVM reports the error and doesn't access freed memory<br>
+; in doing so.<br>
+<br>
+;<MODULE_BLOCK NumWords=217 BlockCodeSize=3><br>
+;  <VERSION op0=1/><br>
+;  <BLOCKINFO_BLOCK/><br>
+;  <TYPE_BLOCK_ID NumWords=23 BlockCodeSize=4><br>
+;    <NUMENTRY op0=25/><br>
+;    <INTEGER op0=8/><br>
+;    <POINTER abbrevid=4 op0=0 op1=0/><br>
+;    <POINTER abbrevid=4 op0=1 op1=0/><br>
+;    <ARRAY abbrevid=9 op0=6 op1=0/><br>
+;    <POINTER abbrevid=4 op0=3 op1=0/><br>
+;    <ARRAY abbrevid=9 op0=10 op1=0/><br>
+;    <POINTER abbrevid=4 op0=5 op1=0/><br>
+;    <ARRAY abbrevid=9 op0=4 op1=0/><br>
+;    <POINTER abbrevid=4 op0=7 op1=0/><br>
+;    <ARRAY abbrevid=9 op0=5 op1=0/><br>
+;    <POINTER abbrevid=4 op0=9 op1=0/><br>
+;    <STRUCT_NAME abbrevid=7 op0=115 op1=116 op2=114 op3=117 op4=99 op5=116 op6=46 op7=112 op8=97 op9=105 op10=114 op11=46 op12=48/><br>
+;    <STRUCT_NAMED abbrevid=8 op0=0 op1=1 op2=1/><br>
+;    <ARRAY abbrevid=9 op0=2 op1=11/><br>
+;    <POINTER abbrevid=4 op0=12 op1=0/><br>
+;    <FUNCTION abbrevid=5 op0=0 op1=1 op2=1 op3=1/><br>
+;    <POINTER abbrevid=4 op0=14 op1=0/><br>
+;    <FUNCTION abbrevid=5 op0=0 op1=1 op2=1/><br>
+;    <POINTER abbrevid=4 op0=16 op1=0/><br>
+;    <INTEGER op0=64/><br>
+;    <FUNCTION abbrevid=5 op0=0 op1=1 op2=18/><br>
+;    <POINTER abbrevid=4 op0=19 op1=0/><br>
+;    <INTEGER op0=32/><br>
+;    <FUNCTION abbrevid=5 op0=0 op1=21/><br>
+;    <POINTER abbrevid=4 op0=22 op1=0/><br>
+;    <VOID/><br>
+;  </TYPE_BLOCK_ID><br>
+;  <GLOBALVAR abbrevid=4 op0=2 op1=0 op2=0 op3=0 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=2 op1=0 op2=0 op3=0 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=2 op1=0 op2=0 op3=0 op4=0 op5=0/><br>
+;  <GLOBALVAR op0=4 op1=1 op2=25 op3=9 op4=0 op5=0 op6=0 op7=0 op8=1 op9=0/><br>
+;  <GLOBALVAR op0=6 op1=1 op2=26 op3=9 op4=0 op5=0 op6=0 op7=0 op8=1 op9=0/><br>
+;  <GLOBALVAR op0=8 op1=1 op2=27 op3=9 op4=0 op5=0 op6=0 op7=0 op8=1 op9=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=10 op1=1 op2=28 op3=3 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=6 op1=1 op2=26 op3=3 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=13 op1=1 op2=31 op3=3 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=2 op1=1 op2=23 op3=3 op4=0 op5=0/><br>
+;  <GLOBALVAR abbrevid=4 op0=2 op1=0 op2=24 op3=0 op4=0 op5=0/><br>
+;  <GLOBALVAR op0=10 op1=1 op2=28 op3=9 op4=0 op5=0 op6=0 op7=0 op8=1 op9=0/><br>
+;  <FUNCTION op0=15 op1=0 op2=1 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <FUNCTION op0=17 op1=0 op2=1 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <FUNCTION op0=20 op1=0 op2=1 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <FUNCTION op0=15 op1=0 op2=0 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <FUNCTION op0=17 op1=0 op2=0 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <FUNCTION op0=23 op1=0 op2=0 op3=0 op4=0 op5=0 op6=0 op7=0 op8=0 op9=0/><br>
+;  <CONSTANTS_BLOCK NumWords=20 BlockCodeSize=4><br>
+;    <SETTYPE abbrevid=4 op0=21/><br>
+;    <NULL/><br>
+;    <SETTYPE abbrevid=4 op0=1/><br>
+;    <CE_CAST abbrevid=6 op0=11 op1=17 op2=16/><br>
+;    <CE_INBOUNDS_GEP op0=6 op1=7 op2=21 op3=18 op4=21 op5=18/><br>
+;    <CE_CAST abbrevid=6 op0=11 op1=15 op2=15/><br>
+;    <CE_CAST abbrevid=6 op0=11 op1=13 op2=8/><br>
+;    <CE_CAST abbrevid=6 op0=11 op1=2 op2=9/><br>
+;    <SETTYPE abbrevid=4 op0=3/><br>
+;    <CSTRING abbrevid=11 op0=112 op1=114 op2=105 op3=110 op4=116/><br>
+;    <SETTYPE abbrevid=4 op0=5/><br>
+;    <CSTRING abbrevid=11 op0=115 op1=97 op2=121 op3=72 op4=105 op5=87 op6=105 op7=116 op8=104/><br>
+;    <SETTYPE abbrevid=4 op0=7/><br>
+;    <CSTRING abbrevid=11 op0=110 op1=101 op2=119/><br>
+;    <SETTYPE abbrevid=4 op0=9/><br>
+;    <CSTRING abbrevid=11 op0=109 op1=97 op2=105 op3=110/><br>
+;    <SETTYPE abbrevid=4 op0=11/><br>
+;    <AGGREGATE abbrevid=8 op0=31 op1=19/><br>
+;    <AGGREGATE abbrevid=8 op0=20 op1=21/><br>
+;    <SETTYPE abbrevid=4 op0=12/><br>
+;    <AGGREGATE abbrevid=8 op0=28 op1=29/><br>
+;    <SETTYPE abbrevid=4 op0=1/><br>
+;    <CE_INBOUNDS_GEP op0=10 op1=6 op2=21 op3=18 op4=21 op5=18/><br>
+;  </CONSTANTS_BLOCK><br>
+;  <METADATA_BLOCK NumWords=23 BlockCodeSize=3><br>
+;    <METADATA_KIND op0=0 op1=100 op2=98 op3=103/><br>
+;    <METADATA_KIND op0=1 op1=116 op2=98 op3=97 op4=97/><br>
+;    <METADATA_KIND op0=2 op1=112 op2=114 op3=111 op4=102/><br>
+;    <METADATA_KIND op0=3 op1=102 op2=112 op3=109 op4=97 op5=116 op6=104/><br>
+;    <METADATA_KIND op0=4 op1=114 op2=97 op3=110 op4=103 op5=101/><br>
+;    <METADATA_KIND op0=5 op1=116 op2=98 op3=97 op4=97 op5=46 op6=115 op7=116 op8=114 op9=117 op10=99 op11=116/><br>
+;    <METADATA_KIND op0=6 op1=105 op2=110 op3=118 op4=97 op5=114 op6=105 op7=97 op8=110 op9=116 op10=46 op11=108 op12=111 op13=97 op14=100/><br>
+;  </METADATA_BLOCK><br>
+;  <VALUE_SYMTAB NumWords=29 BlockCodeSize=4><br>
+;    <ENTRY abbrevid=6 op0=16 op1=101 op2=120 op3=97 op4=109 op5=112 op6=108 op7=101 op8=95 op9=109 op10=97 op11=105 op12=110/><br>
+;    <ENTRY abbrevid=6 op0=1 op1=99 op2=111 op3=110 op4=115 op5=111 op6=108 op7=101/><br>
+;    <ENTRY abbrevid=6 op0=2 op1=103 op2=114 op3=101 op4=101 op5=116 op6=105 op7=110 op8=103/><br>
+;    <ENTRY abbrevid=6 op0=15 op1=101 op2=120 op3=97 op4=109 op5=112 op6=108 op7=101 op8=95 op9=115 op10=97 op11=121 op12=72 op13=105 op14=87 op15=105 op16=116 op17=104/><br>
+;    <ENTRY abbrevid=6 op0=0 op1=115 op2=116 op3=114 op4=105 op5=110 op6=103/><br>
+;    <ENTRY abbrevid=6 op0=14 op1=109 op2=97 op3=108 op4=108 op5=111 op6=99/><br>
+;    <ENTRY abbrevid=6 op0=8 op1=101 op2=120 op3=97 op4=109 op5=112 op6=108 op7=101 op8=95 op9=118 op10=116 op11=97 op12=98/><br>
+;    <ENTRY abbrevid=6 op0=13 op1=115 op2=116 op3=114 op4=105 op5=110 op6=103 op7=95 op8=115 op9=116 op10=114 op11=105 op12=110 op13=103 op14=76 op15=105 op16=116 op17=101 op18=114 op19=97 op20=108/><br>
+;    <ENTRY abbrevid=6 op0=9 op1=95 op2=95 op3=101 op4=120 op5=97 op6=109 op7=112 op8=108 op9=101/><br>
+;    <ENTRY abbrevid=6 op0=12 op1=103 op2=101 op3=116 op4=102 op5=117 op6=110 op7=99/><br>
+;    <ENTRY abbrevid=6 op0=10 op1=101 op2=120 op3=97 op4=109 op5=112 op6=108 op7=101/><br>
+;    <ENTRY abbrevid=6 op0=17 op1=109 op2=97 op3=105 op4=110/><br>
+;  </VALUE_SYMTAB><br>
+;  <FUNCTION_BLOCK NumWords=18 BlockCodeSize=4><br>
+;    <DECLAREBLOCKS op0=1/><br>
+;    <CONSTANTS_BLOCK NumWords=3 BlockCodeSize=4><br>
+;      <SETTYPE abbrevid=4 op0=1/><br>
+;      <CE_INBOUNDS_GEP op0=4 op1=3 op2=21 op3=18 op4=21 op5=18/><br>
+;    </CONSTANTS_BLOCK><br>
+;    <INST_LOAD abbrevid=4 op0=34 op1=0 op2=0/><br>
+;    <INST_CALL op0=0 op1=0 op2=24 op3=1 op4=2/><br>
+;    <INST_CAST abbrevid=7 op0=1 op1=15 op2=11/><br>
+;    <INST_CALL op0=0 op1=0 op2=1 op3=3 op4=5/><br>
+;    <INST_RET abbrevid=9 op0=1/><br>
+;    <VALUE_SYMTAB NumWords=4 BlockCodeSize=4><br>
+;      <BBENTRY abbrevid=7 op0=0 op1=101 op2=110 op3=116 op4=114 op5=121/><br>
+;      <ENTRY abbrevid=6 op0=33 op1=115 op2=97 op3=121 op4=105 op5=110 op6=103/><br>
+;    </VALUE_SYMTAB><br>
+;  </FUNCTION_BLOCK><br>
+;  <FUNCTION_BLOCK NumWords=23 BlockCodeSize=4><br>
+;    <DECLAREBLOCKS op0=1/><br>
+;    <CONSTANTS_BLOCK NumWords=4 BlockCodeSize=4><br>
+;      <SETTYPE abbrevid=4 op0=1/><br>
+;      <CE_INBOUNDS_GEP op0=6 op1=4 op2=21 op3=18 op4=21 op5=18/><br>
+;      <CE_INBOUNDS_GEP op0=8 op1=5 op2=21 op3=18 op4=21 op5=18/><br>
+;    </CONSTANTS_BLOCK><br>
+;    <INST_LOAD op0=4294966291 op1=2 op2=0 op3=0/><br>
+;    <INST_CALL op0=0 op1=0 op2=24 op3=1 op4=3/><br>
+;    <INST_CAST abbrevid=7 op0=1 op1=15 op2=11/><br>
+;    <INST_LOAD abbrevid=4 op0=36 op1=0 op2=0/><br>
+;    <INST_CALL op0=0 op1=0 op2=27 op3=1 op4=5/><br>
+;    <INST_CAST abbrevid=7 op0=1 op1=17 op2=11/><br>
+;    <INST_CALL op0=0 op1=0 op2=1 op3=3/><br>
+;    <INST_CALL op0=0 op1=0 op2=5 op3=7 op4=1/><br>
+;    <INST_RET abbrevid=9 op0=1/><br>
+;    <VALUE_SYMTAB NumWords=2 BlockCodeSize=4><br>
+;      <BBENTRY abbrevid=7 op0=0 op1=101 op2=110 op3=116 op4=114 op5=121/><br>
+;    </VALUE_SYMTAB><br>
+;  </FUNCTION_BLOCK><br>
+;  <FUNCTION_BLOCK NumWords=15 BlockCodeSize=4><br>
+;    <DECLAREBLOCKS op0=1/><br>
+;    <CONSTANTS_BLOCK NumWords=3 BlockCodeSize=4><br>
+;      <SETTYPE abbrevid=4 op0=1/><br>
+;      <CE_INBOUNDS_GEP op0=10 op1=11 op2=21 op3=18 op4=21 op5=18/><br>
+;    </CONSTANTS_BLOCK><br>
+;    <INST_LOAD abbrevid=4 op0=23 op1=0 op2=0/><br>
+;    <INST_CALL op0=0 op1=0 op2=22 op3=1 op4=2/><br>
+;    <INST_CAST abbrevid=7 op0=1 op1=17 op2=11/><br>
+;    <INST_CALL op0=0 op1=0 op2=1 op3=3/><br>
+;    <INST_RET abbrevid=9 op0=19/><br>
+;    <VALUE_SYMTAB NumWords=2 BlockCodeSize=4><br>
+;      <BBENTRY abbrevid=7 op0=0 op1=101 op2=110 op3=116 op4=114 op5=121/><br>
+;    </VALUE_SYMTAB><br>
+;  </FUNCTION_BLOCK><br>
+;</MODULE_BLOCK><br>
<br>
Added: llvm/trunk/test/Bitcode/pr18704.ll.bc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/pr18704.ll.bc?rev=204920&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/pr18704.ll.bc?rev=204920&view=auto</a><br>

==============================================================================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/Bitcode/pr18704.ll.bc<br>
------------------------------------------------------------------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>