]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
VfrCompile: fix invalid comparison between pointer and integer
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrUtilityLib.cpp
index 21a479db68c29b6a4c0e54ebda705401bf8127ed..2f9797518c324af135622e4f0e062837adb8b91e 100644 (file)
@@ -2,7 +2,7 @@
   \r
   Vfr common library functions.\r
 \r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "stdio.h"\r
 #include "stdlib.h"\r
+#include "CommonLib.h"\r
 #include "VfrUtilityLib.h"\r
 #include "VfrFormPkg.h"\r
 \r
@@ -109,6 +110,10 @@ SConfigInfo::SConfigInfo (
   case EFI_IFR_TYPE_STRING :\r
     memcpy (mValue, &Value.string, mWidth);\r
     break;\r
+  case EFI_IFR_TYPE_BUFFER :\r
+    memcpy (mValue, &Value.u8, mWidth);\r
+    break;\r
+\r
   case EFI_IFR_TYPE_OTHER :\r
     return;\r
   }\r
@@ -118,7 +123,7 @@ SConfigInfo::~SConfigInfo (
   VOID\r
   )\r
 {\r
-  BUFFER_SAFE_FREE (mValue);\r
+  ARRAY_SAFE_FREE (mValue);\r
 }\r
 \r
 SConfigItem::SConfigItem (\r
@@ -195,9 +200,9 @@ SConfigItem::~SConfigItem (
 {\r
   SConfigInfo  *Info;\r
 \r
-  BUFFER_SAFE_FREE (mName);\r
-  BUFFER_SAFE_FREE (mGuid);\r
-  BUFFER_SAFE_FREE (mId);\r
+  ARRAY_SAFE_FREE (mName);\r
+  ARRAY_SAFE_FREE (mGuid);\r
+  ARRAY_SAFE_FREE (mId);\r
   while (mInfoStrList != NULL) {\r
     Info = mInfoStrList;\r
     mInfoStrList = mInfoStrList->mNext;\r
@@ -660,7 +665,7 @@ CVfrVarDataTypeDB::GetTypeField (
 {\r
   SVfrDataField  *pField = NULL;\r
 \r
-  if ((FName == NULL) && (Type == NULL)) {\r
+  if ((FName == NULL) || (Type == NULL)) {\r
     return VFR_RETURN_FATAL_ERROR;\r
   }\r
 \r
@@ -1323,7 +1328,7 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   if (Guid != NULL) {\r
     mGuid = *Guid;\r
   } else {\r
-    memset (&Guid, 0, sizeof (EFI_GUID));\r
+    memset (&mGuid, 0, sizeof (EFI_GUID));\r
   }\r
   if (StoreName != NULL) {\r
     mVarStoreName = new CHAR8[strlen(StoreName) + 1];\r
@@ -1350,7 +1355,7 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   if (Guid != NULL) {\r
     mGuid = *Guid;\r
   } else {\r
-    memset (&Guid, 0, sizeof (EFI_GUID));\r
+    memset (&mGuid, 0, sizeof (EFI_GUID));\r
   }\r
   if (StoreName != NULL) {\r
     mVarStoreName = new CHAR8[strlen(StoreName) + 1];\r
@@ -1388,7 +1393,7 @@ SVfrVarStorageNode::~SVfrVarStorageNode (
   )\r
 {\r
   if (mVarStoreName != NULL) {\r
-    delete mVarStoreName;\r
+    delete[] mVarStoreName;\r
   }\r
 \r
   if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {\r
@@ -1414,6 +1419,8 @@ CVfrDataStorage::CVfrDataStorage (
   mNameVarStoreList        = NULL;\r
   mCurrVarStorageNode      = NULL;\r
   mNewVarStorageNode       = NULL;\r
+  mBufferFieldInfoListHead = NULL;\r
+  mBufferFieldInfoListTail = NULL;\r
 }\r
 \r
 CVfrDataStorage::~CVfrDataStorage (\r
@@ -1467,6 +1474,10 @@ CVfrDataStorage::GetFreeVarStoreId (
     }\r
   }\r
 \r
+  if (Index == EFI_FREE_VARSTORE_ID_BITMAP_SIZE) {\r
+    return EFI_VARSTORE_ID_INVALID;\r
+  }\r
+\r
   for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
     if ((mFreeVarStoreIdBitMap[Index] & Mask) == 0) {\r
       mFreeVarStoreIdBitMap[Index] |= Mask;\r
@@ -1512,21 +1523,30 @@ CVfrDataStorage::MarkVarStoreIdUnused (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::DeclareNameVarStoreBegin (\r
-  IN CHAR8    *StoreName\r
+  IN CHAR8           *StoreName,\r
+  IN EFI_VARSTORE_ID VarStoreId\r
   )\r
 {\r
   SVfrVarStorageNode *pNode = NULL;\r
-  EFI_VARSTORE_ID    VarStoreId;\r
+  EFI_VARSTORE_ID    TmpVarStoreId;\r
 \r
   if (StoreName == NULL) {\r
     return VFR_RETURN_FATAL_ERROR;\r
   }\r
 \r
-  if (GetVarStoreId (StoreName, &VarStoreId) == VFR_RETURN_SUCCESS) {\r
+  if (GetVarStoreId (StoreName, &TmpVarStoreId) == VFR_RETURN_SUCCESS) {\r
     return VFR_RETURN_REDEFINED;\r
   }\r
+  \r
+  if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
+    VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME);\r
+  } else {\r
+    if (ChekVarStoreIdFree (VarStoreId) == FALSE) {\r
+      return VFR_RETURN_VARSTOREID_REDEFINED;\r
+    }\r
+    MarkVarStoreIdUsed (VarStoreId);\r
+  }\r
 \r
-  VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME);\r
   if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {\r
     return VFR_RETURN_UNDEFINED;\r
   }\r
@@ -1985,6 +2005,48 @@ CVfrDataStorage::GetEfiVarStoreInfo (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::AddBufferVarStoreFieldInfo (\r
+  IN EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  BufferVarStoreFieldInfoNode *pNew;\r
+\r
+  if ((pNew = new BufferVarStoreFieldInfoNode(Info)) == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  if (mBufferFieldInfoListHead == NULL) {\r
+    mBufferFieldInfoListHead = pNew;\r
+    mBufferFieldInfoListTail= pNew;\r
+  } else {\r
+    mBufferFieldInfoListTail->mNext = pNew;\r
+    mBufferFieldInfoListTail = pNew;\r
+  }\r
+\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetBufferVarStoreFieldInfo (\r
+  IN OUT EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  BufferVarStoreFieldInfoNode *pNode;\r
+\r
+  pNode = mBufferFieldInfoListHead;\r
+  while (pNode != NULL) {\r
+    if (Info->mVarStoreId == pNode->mVarStoreInfo.mVarStoreId &&\r
+      Info->mInfo.mVarOffset == pNode->mVarStoreInfo.mInfo.mVarOffset) {\r
+      Info->mVarTotalSize = pNode->mVarStoreInfo.mVarTotalSize;\r
+      Info->mVarType      = pNode->mVarStoreInfo.mVarType;\r
+      return VFR_RETURN_SUCCESS;\r
+    }\r
+    pNode = pNode->mNext;\r
+  }\r
+  return VFR_RETURN_FATAL_ERROR;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetNameVarStoreInfo (\r
   OUT EFI_VARSTORE_INFO  *Info,\r
@@ -2040,7 +2102,7 @@ SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
   )\r
 {\r
   if (mRefName != NULL) {\r
-    delete mRefName;\r
+    delete[] mRefName;\r
   }\r
 }\r
 \r
@@ -2242,7 +2304,7 @@ SVfrRuleNode::~SVfrRuleNode (
   )\r
 {\r
   if (mRuleName != NULL) {\r
-    delete mRuleName;\r
+    delete[] mRuleName;\r
   }\r
 }\r
 \r
@@ -2328,6 +2390,22 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
   mVarTotalSize    = Info.mVarTotalSize;\r
 }\r
 \r
+EFI_VARSTORE_INFO&\r
+EFI_VARSTORE_INFO::operator= (\r
+  IN CONST EFI_VARSTORE_INFO &Info\r
+  )\r
+{\r
+  if (this != &Info) {\r
+    mVarStoreId      = Info.mVarStoreId;\r
+    mInfo.mVarName   = Info.mInfo.mVarName;\r
+    mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
+    mVarType         = Info.mVarType;\r
+    mVarTotalSize    = Info.mVarTotalSize;\r
+  }\r
+\r
+  return *this;\r
+}\r
+\r
 BOOLEAN\r
 EFI_VARSTORE_INFO::operator == (\r
   IN EFI_VARSTORE_INFO  *Info\r
@@ -2344,6 +2422,26 @@ EFI_VARSTORE_INFO::operator == (
   return FALSE;\r
 }\r
 \r
+BufferVarStoreFieldInfoNode::BufferVarStoreFieldInfoNode(\r
+  IN EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  mVarStoreInfo.mVarType               = Info->mVarType;\r
+  mVarStoreInfo.mVarTotalSize          = Info->mVarTotalSize;\r
+  mVarStoreInfo.mInfo.mVarOffset       = Info->mInfo.mVarOffset;\r
+  mVarStoreInfo.mVarStoreId            = Info->mVarStoreId;\r
+  mNext = NULL;\r
+}\r
+\r
+BufferVarStoreFieldInfoNode::~BufferVarStoreFieldInfoNode ()\r
+{\r
+  mVarStoreInfo.mVarType               = EFI_IFR_TYPE_OTHER;\r
+  mVarStoreInfo.mVarTotalSize          = 0;\r
+  mVarStoreInfo.mInfo.mVarOffset       = EFI_VAROFFSET_INVALID;\r
+  mVarStoreInfo.mVarStoreId            = EFI_VARSTORE_ID_INVALID;\r
+  mNext = NULL;\r
+}\r
+\r
 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;\r
 \r
 EFI_QUESTION_ID\r
@@ -2359,6 +2457,10 @@ CVfrQuestionDB::GetFreeQuestionId (
     }\r
   }\r
 \r
+  if (Index == EFI_FREE_QUESTION_ID_BITMAP_SIZE) {\r
+    return EFI_QUESTION_ID_INVALID;\r
+  }\r
+\r
   for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
     if ((mFreeQIdBitMap[Index] & Mask) == 0) {\r
       mFreeQIdBitMap[Index] |= Mask;\r
@@ -2437,11 +2539,11 @@ SVfrQuestionNode::~SVfrQuestionNode (
   )\r
 {\r
   if (mName != NULL) {\r
-    delete mName;\r
+    delete[] mName;\r
   }\r
 \r
   if (mVarIdStr != NULL) {\r
-    delete mVarIdStr;\r
+    delete[] mVarIdStr;\r
   }\r
 }\r
 \r
@@ -2619,6 +2721,14 @@ CVfrQuestionDB::RegisterNewDateQuestion (
   CHAR8                 Index;\r
 \r
   if (BaseVarId == NULL && Name == NULL) {\r
+    if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+      QuestionId = GetFreeQuestionId ();\r
+    } else {\r
+      if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+        goto Err;\r
+      }\r
+      MarkQuestionIdUsed (QuestionId);\r
+    }\r
     return;\r
   }\r
 \r
@@ -2787,6 +2897,14 @@ CVfrQuestionDB::RegisterNewTimeQuestion (
   CHAR8                 Index;\r
 \r
   if (BaseVarId == NULL && Name == NULL) {\r
+    if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+      QuestionId = GetFreeQuestionId ();\r
+    } else {\r
+      if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+        goto Err;\r
+      }\r
+      MarkQuestionIdUsed (QuestionId);\r
+    }\r
     return;\r
   }\r
 \r
@@ -3254,11 +3372,11 @@ CVfrStringDB::GetVarStoreNameFormStringId (
   UINT8       BlockType;\r
   EFI_HII_STRING_PACKAGE_HDR *PkgHeader;\r
   \r
-  if (mStringFileName == '\0' ) {\r
+  if (mStringFileName == NULL) {\r
     return NULL;\r
   }\r
 \r
-  if ((pInFile = fopen (mStringFileName, "rb")) == NULL) {\r
+  if ((pInFile = fopen (LongFilePath (mStringFileName), "rb")) == NULL) {\r
     return NULL;\r
   }\r
 \r
@@ -3285,7 +3403,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
   // Check the String package.\r
   //\r
   if (PkgHeader->Header.Type != EFI_HII_PACKAGE_STRINGS) {\r
-    delete StringPtr;\r
+    delete[] StringPtr;\r
     return NULL;\r
   }\r
 \r
@@ -3312,7 +3430,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
   //\r
   Status = FindStringBlock(Current, StringId, &NameOffset, &BlockType);\r
   if (Status != EFI_SUCCESS) {\r
-    delete StringPtr;\r
+    delete[] StringPtr;\r
     return NULL;\r
   }\r
 \r
@@ -3345,7 +3463,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
     break;\r
   }\r
 \r
-  delete StringPtr;\r
+  delete[] StringPtr;\r
 \r
   return VarStoreName;\r
 }\r
@@ -3602,5 +3720,7 @@ CVfrStringDB::GetUnicodeStringTextSize (
 BOOLEAN  VfrCompatibleMode = FALSE;\r
 \r
 CVfrVarDataTypeDB gCVfrVarDataTypeDB;\r
+CVfrDefaultStore  gCVfrDefaultStore;\r
+CVfrDataStorage  gCVfrDataStorage;\r
 \r
 \r