]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
BaseTools/VfrCompile: Avoid possible NULL pointer dereference
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.cpp
index 0b7b8b1776f594147c04065b36372bed6103848c..aa27ce0be72e0682bbda0e9183eaa7bfb3969079 100644 (file)
@@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "stdio.h"\r
+#include "assert.h"\r
 #include "VfrFormPkg.h"\r
 \r
 /*\r
@@ -669,6 +670,8 @@ CFormPkg::AdjustDynamicInsertOpcode (
 \r
   InserPositionNode  = GetBinBufferNodeForAddr(InserPositionAddr);\r
   InsertOpcodeNode = GetBinBufferNodeForAddr(InsertOpcodeAddr);\r
+  assert (InserPositionNode != NULL);\r
+  assert (InsertOpcodeNode  != NULL);\r
 \r
   if (InserPositionNode == InsertOpcodeNode) {\r
     //\r
@@ -741,6 +744,8 @@ CFormPkg::AdjustDynamicInsertOpcode (
       // Insert the last restore data node.\r
       //\r
       TmpNode = GetNodeBefore (InsertOpcodeNode);\r
+      assert (TmpNode != NULL);\r
+\r
       if (TmpNode == InserPositionNode) {\r
         NewRestoreNodeBegin->mNext = NewRestoreNodeEnd;\r
       } else {\r
@@ -790,6 +795,8 @@ CFormPkg::AdjustDynamicInsertOpcode (
       mBufferNodeQueueTail = NewLastEndNode;\r
     } else if (mBufferNodeQueueTail->mBufferFree - mBufferNodeQueueTail->mBufferStart == 2) {\r
       TmpNode = GetNodeBefore(mBufferNodeQueueTail);\r
+      assert (TmpNode != NULL);\r
+\r
       TmpNode->mNext = NewRestoreNodeBegin;\r
       if (NewRestoreNodeEnd != NULL) {\r
         NewRestoreNodeEnd->mNext = mBufferNodeQueueTail;\r
@@ -1314,7 +1321,7 @@ CIfrRecordInfoDB::IfrAdjustDynamicOpcodeInRecords (
   //\r
   // Check the nodes whether exist.\r
   //\r
-  if (pNodeBeforeDynamic == NULL || pAdjustNode == NULL) {\r
+  if (pNodeBeforeDynamic == NULL || pAdjustNode == NULL || pNodeBeforeAdjust == NULL) {\r
     return FALSE;\r
   }\r
 \r
@@ -1854,6 +1861,10 @@ CIfrRecordInfoDB::IfrCreateDefaultForQuestion (
       pSNode = pSNode->mNext;\r
       OpcodeCount++;\r
     }\r
+\r
+    assert (pSNode);\r
+    assert (pENode);\r
+\r
     //\r
     // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
     //\r
@@ -1875,6 +1886,7 @@ CIfrRecordInfoDB::IfrCreateDefaultForQuestion (
         while (pSNode != NULL && pSNode->mNext != NULL && OpcodeNumber-- != 0) {\r
           pOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
           Obj = new CIfrObj (pOpHead->OpCode, NULL, pSNode->mBinBufLen, FALSE);\r
+          assert (Obj != NULL);\r
           Obj->SetLineNo (pSNode->mLineNo);\r
           ObjBinBuf = Obj->GetObjBinAddr();\r
           memcpy (ObjBinBuf, pSNode->mIfrBinBuf, (UINTN)pSNode->mBinBufLen);\r
@@ -2378,6 +2390,8 @@ CIfrObj::CIfrObj (
   mObjBinBuf   = ((DelayEmit == FALSE) && (gCreateOp == TRUE)) ? gCFormPkg.IfrBinBufferGet (mObjBinLen) : new CHAR8[EFI_IFR_MAX_LENGTH];\r
   mRecordIdx   = (gCreateOp == TRUE) ? gCIfrRecordInfoDB.IfrRecordRegister (0xFFFFFFFF, mObjBinBuf, mObjBinLen, mPkgOffset) : EFI_IFR_RECORDINFO_IDX_INVALUD;\r
 \r
+  assert (mObjBinBuf != NULL);\r
+\r
   if (IfrObj != NULL) {\r
     *IfrObj    = mObjBinBuf;\r
   }\r