]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrUtilityLib.cpp
index b3d1ac54ff3ffe2a5b077aff4fd0cd52de8bf742..0d0f926f82660a4fa498480094fce1a32b294fe6 100644 (file)
@@ -1,20 +1,21 @@
 /** @file\r
-  \r
+\r
   Vfr common library functions.\r
 \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
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+Copyright (c) 2004 - 2018, 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
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
 \r
 #include "stdio.h"\r
 #include "stdlib.h"\r
+#include "assert.h"\r
 #include "CommonLib.h"\r
 #include "VfrUtilityLib.h"\r
 #include "VfrFormPkg.h"\r
@@ -71,9 +72,9 @@ CVfrBinaryOutput::WriteEnd (
 }\r
 \r
 SConfigInfo::SConfigInfo (\r
-  IN UINT8              Type, \r
-  IN UINT16             Offset, \r
-  IN UINT32             Width, \r
+  IN UINT8              Type,\r
+  IN UINT16             Offset,\r
+  IN UINT32             Width,\r
   IN EFI_IFR_TYPE_VALUE Value\r
   )\r
 {\r
@@ -123,7 +124,7 @@ SConfigInfo::~SConfigInfo (
   VOID\r
   )\r
 {\r
-  BUFFER_SAFE_FREE (mValue);\r
+  ARRAY_SAFE_FREE (mValue);\r
 }\r
 \r
 SConfigItem::SConfigItem (\r
@@ -200,9 +201,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
@@ -359,7 +360,7 @@ CVfrBufferConfig::Write (
 \r
   case 'i' : // set info\r
     if (mItemListPos->mId != NULL) {\r
-      delete mItemListPos->mId;\r
+      delete[] mItemListPos->mId;\r
     }\r
     mItemListPos->mId = NULL;\r
     if (Id != NULL) {\r
@@ -552,7 +553,7 @@ _STR2U32 (
     //\r
     // BUG: does not handle overflow here\r
     //\r
-       (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+  (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
 \r
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
       Value += (c - 'a' + 10);\r
@@ -600,6 +601,65 @@ CVfrVarDataTypeDB::ExtractStructTypeName (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
+/**\r
+  Check whether the DataType contain bit field.\r
+\r
+  @param  TypeName     The name of the type.\r
+\r
+**/\r
+BOOLEAN\r
+CVfrVarDataTypeDB::DataTypeHasBitField (\r
+  IN  CHAR8         *TypeName\r
+  )\r
+{\r
+  SVfrDataType        *pType  = NULL;\r
+  SVfrDataField       *pTmp;\r
+\r
+  GetDataType (TypeName, &pType);\r
+\r
+  if (pType == NULL){\r
+    return FALSE;\r
+  }\r
+  for (pTmp = pType->mMembers; pTmp!= NULL; pTmp = pTmp->mNext) {\r
+    if (pTmp->mIsBitField) {\r
+      return TRUE;\r
+    }\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Check whether the field is bit field or not.\r
+\r
+  @param  VarStr     Point to the field name which may contain the structure name.\r
+\r
+**/\r
+BOOLEAN\r
+CVfrVarDataTypeDB::IsThisBitField (\r
+  IN  CHAR8   *VarStr\r
+  )\r
+{\r
+  CHAR8             FName[MAX_NAME_LEN];\r
+  CHAR8             TName[MAX_NAME_LEN];\r
+  UINT32            ArrayIdx;\r
+  SVfrDataType      *pType  = NULL;\r
+  SVfrDataField     *pField = NULL;\r
+\r
+  CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
+  CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
+\r
+  while (*VarStr != '\0') {\r
+    CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
+    CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
+    pType  = pField->mFieldType;\r
+  }\r
+  if (pField != NULL && pField->mIsBitField) {\r
+    return TRUE;\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
   IN  CHAR8   *&VarStr,\r
@@ -665,7 +725,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
@@ -697,13 +757,14 @@ EFI_VFR_RETURN_CODE
 CVfrVarDataTypeDB::GetFieldOffset (\r
   IN  SVfrDataField *Field,\r
   IN  UINT32        ArrayIdx,\r
-  OUT UINT32        &Offset\r
+  OUT UINT32        &Offset,\r
+  IN  BOOLEAN       IsBitField\r
   )\r
 {\r
   if (Field == NULL) {\r
     return VFR_RETURN_FATAL_ERROR;\r
   }\r
-  \r
+\r
   //\r
   // Framework Vfr file Array Index is from 1.\r
   // But Uefi Vfr file Array Index is from 0.\r
@@ -718,7 +779,7 @@ CVfrVarDataTypeDB::GetFieldOffset (
   if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {\r
     return VFR_RETURN_ERROR_ARRARY_NUM;\r
   }\r
-  \r
+\r
   //\r
   // Be compatible with the current usage\r
   // If ArraryIdx is not specified, the first one is used.\r
@@ -729,8 +790,11 @@ CVfrVarDataTypeDB::GetFieldOffset (
   //   return VFR_RETURN_ERROR_ARRARY_NUM;\r
   // }\r
   //\r
-\r
-  Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
+  if (IsBitField) {\r
+    Offset = Field->mBitOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx) * 8;\r
+  } else {\r
+    Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
+  }\r
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
@@ -749,7 +813,8 @@ CVfrVarDataTypeDB::GetFieldWidth (
 UINT32\r
 CVfrVarDataTypeDB::GetFieldSize (\r
   IN SVfrDataField *Field,\r
-  IN UINT32       ArrayIdx\r
+  IN UINT32       ArrayIdx,\r
+  IN BOOLEAN      BitField\r
   )\r
 {\r
   if (Field == NULL) {\r
@@ -757,9 +822,13 @@ CVfrVarDataTypeDB::GetFieldSize (
   }\r
 \r
   if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {\r
-    return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
+      return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
   } else {\r
-    return Field->mFieldType->mTotalSize;\r
+    if (BitField) {\r
+      return Field->mBitWidth;\r
+    } else {\r
+      return Field->mFieldType->mTotalSize;\r
+    }\r
   }\r
 }\r
 \r
@@ -774,7 +843,9 @@ CVfrVarDataTypeDB::InternalTypesListInit (
   for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
     New                 = new SVfrDataType;\r
     if (New != NULL) {\r
-      strcpy (New->mTypeName, gInternalTypesTable[Index].mTypeName);\r
+      assert (strlen (gInternalTypesTable[Index].mTypeName) < MAX_NAME_LEN);\r
+      strncpy (New->mTypeName, gInternalTypesTable[Index].mTypeName, MAX_NAME_LEN - 1);\r
+      New->mTypeName[MAX_NAME_LEN - 1] = 0;\r
       New->mType        = gInternalTypesTable[Index].mType;\r
       New->mAlign       = gInternalTypesTable[Index].mAlign;\r
       New->mTotalSize   = gInternalTypesTable[Index].mSize;\r
@@ -788,18 +859,21 @@ CVfrVarDataTypeDB::InternalTypesListInit (
         pYearField->mOffset      = 0;\r
         pYearField->mNext        = pMonthField;\r
         pYearField->mArrayNum    = 0;\r
+        pYearField->mIsBitField = FALSE;\r
 \r
         strcpy (pMonthField->mFieldName, "Month");\r
         GetDataType ((CHAR8 *)"UINT8", &pMonthField->mFieldType);\r
         pMonthField->mOffset     = 2;\r
         pMonthField->mNext       = pDayField;\r
         pMonthField->mArrayNum   = 0;\r
+        pMonthField->mIsBitField = FALSE;\r
 \r
         strcpy (pDayField->mFieldName, "Day");\r
         GetDataType ((CHAR8 *)"UINT8", &pDayField->mFieldType);\r
         pDayField->mOffset       = 3;\r
         pDayField->mNext         = NULL;\r
         pDayField->mArrayNum     = 0;\r
+        pDayField->mIsBitField = FALSE;\r
 \r
         New->mMembers            = pYearField;\r
       } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {\r
@@ -812,18 +886,21 @@ CVfrVarDataTypeDB::InternalTypesListInit (
         pHoursField->mOffset     = 0;\r
         pHoursField->mNext       = pMinutesField;\r
         pHoursField->mArrayNum   = 0;\r
+        pHoursField->mIsBitField = FALSE;\r
 \r
         strcpy (pMinutesField->mFieldName, "Minutes");\r
         GetDataType ((CHAR8 *)"UINT8", &pMinutesField->mFieldType);\r
         pMinutesField->mOffset   = 1;\r
         pMinutesField->mNext     = pSecondsField;\r
         pMinutesField->mArrayNum = 0;\r
+        pMinutesField->mIsBitField = FALSE;\r
 \r
         strcpy (pSecondsField->mFieldName, "Seconds");\r
         GetDataType ((CHAR8 *)"UINT8", &pSecondsField->mFieldType);\r
         pSecondsField->mOffset   = 2;\r
         pSecondsField->mNext     = NULL;\r
         pSecondsField->mArrayNum = 0;\r
+        pSecondsField->mIsBitField = FALSE;\r
 \r
         New->mMembers            = pHoursField;\r
       } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_REF") == 0) {\r
@@ -837,24 +914,28 @@ CVfrVarDataTypeDB::InternalTypesListInit (
         pQuestionIdField->mOffset     = 0;\r
         pQuestionIdField->mNext       = pFormIdField;\r
         pQuestionIdField->mArrayNum   = 0;\r
+        pQuestionIdField->mIsBitField = FALSE;\r
 \r
         strcpy (pFormIdField->mFieldName, "FormId");\r
         GetDataType ((CHAR8 *)"UINT16", &pFormIdField->mFieldType);\r
         pFormIdField->mOffset   = 2;\r
         pFormIdField->mNext     = pFormSetGuidField;\r
         pFormIdField->mArrayNum = 0;\r
+        pFormIdField->mIsBitField = FALSE;\r
 \r
         strcpy (pFormSetGuidField->mFieldName, "FormSetGuid");\r
         GetDataType ((CHAR8 *)"EFI_GUID", &pFormSetGuidField->mFieldType);\r
         pFormSetGuidField->mOffset   = 4;\r
         pFormSetGuidField->mNext     = pDevicePathField;\r
         pFormSetGuidField->mArrayNum = 0;\r
+        pFormSetGuidField->mIsBitField = FALSE;\r
 \r
         strcpy (pDevicePathField->mFieldName, "DevicePath");\r
         GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField->mFieldType);\r
         pDevicePathField->mOffset   = 20;\r
         pDevicePathField->mNext     = NULL;\r
         pDevicePathField->mArrayNum = 0;\r
+        pDevicePathField->mIsBitField = FALSE;\r
 \r
         New->mMembers            = pQuestionIdField;\r
       } else {\r
@@ -877,6 +958,7 @@ CVfrVarDataTypeDB::CVfrVarDataTypeDB (
   mPackAlign     = DEFAULT_PACK_ALIGN;\r
   mPackStack     = NULL;\r
   mFirstNewDataTypeName = NULL;\r
+  mCurrDataType  = NULL;\r
 \r
   InternalTypesListInit ();\r
 }\r
@@ -901,7 +983,7 @@ CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
       pType->mMembers = pType->mMembers->mNext;\r
       delete pField;\r
     }\r
-       delete pType;\r
+  delete pType;\r
   }\r
 \r
   while (mPackStack != NULL) {\r
@@ -978,6 +1060,7 @@ CVfrVarDataTypeDB::DeclareDataTypeBegin (
   pNewType->mTotalSize   = 0;\r
   pNewType->mMembers     = NULL;\r
   pNewType->mNext        = NULL;\r
+  pNewType->mHasBitField = FALSE;\r
 \r
   mNewDataType           = pNewType;\r
 }\r
@@ -1005,7 +1088,128 @@ CVfrVarDataTypeDB::SetNewTypeName (
     }\r
   }\r
 \r
-  strcpy(mNewDataType->mTypeName, TypeName);\r
+  strncpy(mNewDataType->mTypeName, TypeName, MAX_NAME_LEN - 1);\r
+  mNewDataType->mTypeName[MAX_NAME_LEN - 1] = 0;\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+/**\r
+  Record the bit field info in the data type.\r
+\r
+  @param  FieldName     Point to the field name.\r
+  @param  TypeName      Point to the type name.\r
+  @param  Width         The bit width.\r
+  @param  FieldInUnion  The filed is in Union type or Structure type.\r
+\r
+**/\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::DataTypeAddBitField (\r
+  IN CHAR8   *FieldName,\r
+  IN CHAR8   *TypeName,\r
+  IN UINT32   Width,\r
+  IN BOOLEAN FieldInUnion\r
+  )\r
+{\r
+  SVfrDataField       *pNewField  = NULL;\r
+  SVfrDataType        *pFieldType = NULL;\r
+  SVfrDataField       *pTmp;\r
+  UINT32              Align;\r
+  UINT32              MaxDataTypeSize;\r
+  BOOLEAN             UpdateTotalSize;\r
+\r
+  CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
+\r
+  if (Width > MAX_BIT_WIDTH) {\r
+    return VFR_RETURN_BIT_WIDTH_ERROR;\r
+  }\r
+\r
+  if (Width > pFieldType->mTotalSize * 8) {\r
+    return VFR_RETURN_BIT_WIDTH_ERROR;\r
+  }\r
+\r
+  if (FieldName != NULL && strlen (FieldName) >= MAX_NAME_LEN) {\r
+   return VFR_RETURN_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Width == 0 && FieldName != NULL) {\r
+    return VFR_RETURN_INVALID_PARAMETER;\r
+  }\r
+\r
+  for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {\r
+    if (FieldName != NULL && strcmp (pTmp->mFieldName, FieldName) == 0) {\r
+      return VFR_RETURN_REDEFINED;\r
+    }\r
+  }\r
+\r
+  Align = MIN (mPackAlign, pFieldType->mAlign);\r
+  UpdateTotalSize = FALSE;\r
+\r
+  if ((pNewField = new SVfrDataField) == NULL) {\r
+    return VFR_RETURN_OUT_FOR_RESOURCES;\r
+  }\r
+\r
+  MaxDataTypeSize = mNewDataType->mTotalSize;\r
+  if (FieldName != NULL) {\r
+    strncpy (pNewField->mFieldName, FieldName, MAX_NAME_LEN - 1);\r
+    pNewField->mFieldName[MAX_NAME_LEN - 1] = 0;\r
+  }\r
+  pNewField->mFieldType    = pFieldType;\r
+  pNewField->mIsBitField   = TRUE;\r
+  pNewField->mBitWidth     = Width;\r
+  pNewField->mArrayNum     = 0;\r
+  pNewField->mBitOffset    = 0;\r
+  pNewField->mOffset       = 0;\r
+\r
+  if (mNewDataType->mMembers == NULL) {\r
+    mNewDataType->mMembers = pNewField;\r
+    pNewField->mNext       = NULL;\r
+  } else {\r
+    for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)\r
+      ;\r
+    pTmp->mNext            = pNewField;\r
+    pNewField->mNext       = NULL;\r
+  }\r
+\r
+  if (FieldInUnion) {\r
+    pNewField->mOffset = 0;\r
+    if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {\r
+      mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;\r
+    }\r
+  } else {\r
+    //\r
+    // Check whether the bit fields can be contained within one FieldType.\r
+    //\r
+    if (pTmp != NULL && pTmp->mIsBitField && strcmp (pTmp->mFieldType->mTypeName, pNewField->mFieldType->mTypeName) == 0 &&\r
+       (pTmp->mBitOffset - pTmp->mOffset * 8) + pTmp->mBitWidth + pNewField->mBitWidth <= pNewField->mFieldType->mTotalSize * 8) {\r
+      pNewField->mBitOffset = pTmp->mBitOffset + pTmp->mBitWidth;\r
+      pNewField->mOffset = pTmp->mOffset;\r
+      //\r
+      // If BitWidth=0,used to force alignment at the next word boundary.\r
+      // So make this bit field occupy the remaing bit width of current field type.\r
+      //\r
+      if (pNewField->mBitWidth == 0) {\r
+        pNewField->mBitWidth = pNewField->mFieldType->mTotalSize * 8 - (pNewField->mBitOffset - pTmp->mOffset * 8);\r
+      }\r
+    } else {\r
+      //\r
+      // The bit filed start a new memory\r
+      //\r
+      pNewField->mBitOffset = mNewDataType->mTotalSize * 8;\r
+      UpdateTotalSize = TRUE;\r
+    }\r
+  }\r
+\r
+  if (UpdateTotalSize){\r
+    if ((mNewDataType->mTotalSize % Align) == 0) {\r
+      pNewField->mOffset     = mNewDataType->mTotalSize;\r
+    } else {\r
+      pNewField->mOffset     = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);\r
+    }\r
+    mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize);\r
+  }\r
+\r
+  mNewDataType->mAlign     = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
+  mNewDataType->mHasBitField = TRUE;\r
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
@@ -1013,15 +1217,18 @@ EFI_VFR_RETURN_CODE
 CVfrVarDataTypeDB::DataTypeAddField (\r
   IN CHAR8   *FieldName,\r
   IN CHAR8   *TypeName,\r
-  IN UINT32 ArrayNum\r
+  IN UINT32 ArrayNum,\r
+  IN BOOLEAN FieldInUnion\r
   )\r
 {\r
   SVfrDataField       *pNewField  = NULL;\r
   SVfrDataType        *pFieldType = NULL;\r
   SVfrDataField       *pTmp;\r
   UINT32              Align;\r
+  UINT32              MaxDataTypeSize;\r
 \r
   CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
+  MaxDataTypeSize = mNewDataType->mTotalSize;\r
 \r
   if (strlen (FieldName) >= MAX_NAME_LEN) {\r
    return VFR_RETURN_INVALID_PARAMETER;\r
@@ -1038,9 +1245,11 @@ CVfrVarDataTypeDB::DataTypeAddField (
   if ((pNewField = new SVfrDataField) == NULL) {\r
     return VFR_RETURN_OUT_FOR_RESOURCES;\r
   }\r
-  strcpy (pNewField->mFieldName, FieldName);\r
+  strncpy (pNewField->mFieldName, FieldName, MAX_NAME_LEN - 1);\r
+  pNewField->mFieldName[MAX_NAME_LEN - 1] = 0;\r
   pNewField->mFieldType    = pFieldType;\r
   pNewField->mArrayNum     = ArrayNum;\r
+  pNewField->mIsBitField   = FALSE;\r
   if ((mNewDataType->mTotalSize % Align) == 0) {\r
     pNewField->mOffset     = mNewDataType->mTotalSize;\r
   } else {\r
@@ -1057,7 +1266,15 @@ CVfrVarDataTypeDB::DataTypeAddField (
   }\r
 \r
   mNewDataType->mAlign     = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
-  mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
+\r
+  if (FieldInUnion) {\r
+    if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {\r
+      mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;\r
+    }\r
+    pNewField->mOffset = 0;\r
+  } else {\r
+    mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
+  }\r
 \r
   return VFR_RETURN_SUCCESS;\r
 }\r
@@ -1172,21 +1389,26 @@ CVfrVarDataTypeDB::GetDataFieldInfo (
   IN  CHAR8     *VarStr,\r
   OUT UINT16   &Offset,\r
   OUT UINT8    &Type,\r
-  OUT UINT32   &Size\r
+  OUT UINT32   &Size,\r
+  OUT BOOLEAN  &BitField\r
   )\r
 {\r
   CHAR8               TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];\r
   UINT32              ArrayIdx, Tmp;\r
   SVfrDataType        *pType  = NULL;\r
   SVfrDataField       *pField = NULL;\r
+  CHAR8               *VarStrName;\r
 \r
   Offset = 0;\r
   Type   = EFI_IFR_TYPE_OTHER;\r
   Size   = 0;\r
+  VarStrName = VarStr;\r
 \r
   CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
   CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
 \r
+  BitField = IsThisBitField (VarStrName);\r
+\r
   //\r
   // if it is not struct data type\r
   //\r
@@ -1194,13 +1416,17 @@ CVfrVarDataTypeDB::GetDataFieldInfo (
   Size  = pType->mTotalSize;\r
 \r
   while (*VarStr != '\0') {\r
-       CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
+    CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
     CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
     pType  = pField->mFieldType;\r
-    CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);\r
-    Offset = (UINT16) (Offset + Tmp);\r
+    CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS);\r
+    if (BitField && !pField->mIsBitField) {\r
+      Offset = (UINT16) (Offset + Tmp * 8);\r
+    } else {\r
+      Offset = (UINT16) (Offset + Tmp);\r
+    }\r
     Type   = GetFieldWidth (pField);\r
-    Size   = GetFieldSize (pField, ArrayIdx);\r
+    Size   = GetFieldSize (pField, ArrayIdx, BitField);\r
   }\r
   return VFR_RETURN_SUCCESS;\r
 }\r
@@ -1279,10 +1505,10 @@ CVfrVarDataTypeDB::Dump (
     fprintf (File, "\t\tstruct %s {\n", pTNode->mTypeName);\r
     for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) {\r
       if (pFNode->mArrayNum > 0) {\r
-        fprintf (File, "\t\t\t+%08d[%08x] %s[%d] <%s>\n", pFNode->mOffset, pFNode->mOffset, \r
+        fprintf (File, "\t\t\t+%08d[%08x] %s[%d] <%s>\n", pFNode->mOffset, pFNode->mOffset,\r
                   pFNode->mFieldName, pFNode->mArrayNum, pFNode->mFieldType->mTypeName);\r
       } else {\r
-        fprintf (File, "\t\t\t+%08d[%08x] %s <%s>\n", pFNode->mOffset, pFNode->mOffset, \r
+        fprintf (File, "\t\t\t+%08d[%08x] %s <%s>\n", pFNode->mOffset, pFNode->mOffset,\r
                   pFNode->mFieldName, pFNode->mFieldType->mTypeName);\r
       }\r
     }\r
@@ -1310,7 +1536,7 @@ CVfrVarDataTypeDB::ParserDB (
       printf ("\t\t\t%s\t%s\n", pFNode->mFieldType->mTypeName, pFNode->mFieldName);\r
     }\r
     printf ("\t\t};\n");\r
-       printf ("---------------------------------------------------------------\n");\r
+  printf ("---------------------------------------------------------------\n");\r
   }\r
   printf ("***************************************************************\n");\r
 }\r
@@ -1328,7 +1554,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
@@ -1349,13 +1575,14 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   IN CHAR8                 *StoreName,\r
   IN EFI_VARSTORE_ID       VarStoreId,\r
   IN SVfrDataType          *DataType,\r
+  IN BOOLEAN               BitsVarstore,\r
   IN BOOLEAN               Flag\r
   )\r
 {\r
   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
@@ -1365,7 +1592,11 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   }\r
   mNext                    = NULL;\r
   mVarStoreId              = VarStoreId;\r
-  mVarStoreType            = EFI_VFR_VARSTORE_BUFFER;\r
+  if (BitsVarstore) {\r
+    mVarStoreType            = EFI_VFR_VARSTORE_BUFFER_BITS;\r
+  } else {\r
+    mVarStoreType            = EFI_VFR_VARSTORE_BUFFER;\r
+  }\r
   mStorageInfo.mDataType   = DataType;\r
   mAssignedFlag            = Flag;\r
 }\r
@@ -1375,6 +1606,7 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   IN EFI_VARSTORE_ID       VarStoreId\r
   )\r
 {\r
+  memset (&mGuid, 0, sizeof (EFI_GUID));\r
   if (StoreName != NULL) {\r
     mVarStoreName = new CHAR8[strlen(StoreName) + 1];\r
     strcpy (mVarStoreName, StoreName);\r
@@ -1386,6 +1618,7 @@ SVfrVarStorageNode::SVfrVarStorageNode (
   mVarStoreType                      = EFI_VFR_VARSTORE_NAME;\r
   mStorageInfo.mNameSpace.mNameTable = new EFI_VARSTORE_ID[DEFAULT_NAME_TABLE_ITEMS];\r
   mStorageInfo.mNameSpace.mTableSize = 0;\r
+  mAssignedFlag                      = FALSE;\r
 }\r
 \r
 SVfrVarStorageNode::~SVfrVarStorageNode (\r
@@ -1393,11 +1626,11 @@ SVfrVarStorageNode::~SVfrVarStorageNode (
   )\r
 {\r
   if (mVarStoreName != NULL) {\r
-    delete mVarStoreName;\r
+    delete[] mVarStoreName;\r
   }\r
 \r
   if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {\r
-    delete mStorageInfo.mNameSpace.mNameTable;\r
+    delete[] mStorageInfo.mNameSpace.mNameTable;\r
   }\r
 }\r
 \r
@@ -1455,7 +1688,7 @@ CVfrDataStorage::GetFreeVarStoreId (
   )\r
 {\r
   UINT32  Index, Mask, Offset;\r
-  \r
+\r
   //\r
   // Assign the different ID range for the different type VarStore to support Framework Vfr\r
   //\r
@@ -1474,6 +1707,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
@@ -1533,7 +1770,7 @@ CVfrDataStorage::DeclareNameVarStoreBegin (
   if (GetVarStoreId (StoreName, &TmpVarStoreId) == VFR_RETURN_SUCCESS) {\r
     return VFR_RETURN_REDEFINED;\r
   }\r
-  \r
+\r
   if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
     VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME);\r
   } else {\r
@@ -1591,10 +1828,10 @@ CVfrDataStorage::DeclareNameVarStoreEnd (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::DeclareEfiVarStore (\r
-  IN CHAR8          *StoreName, \r
-  IN EFI_GUID       *Guid, \r
+  IN CHAR8          *StoreName,\r
+  IN EFI_GUID       *Guid,\r
   IN EFI_STRING_ID  NameStrId,\r
   IN UINT32         VarSize,\r
   IN BOOLEAN        Flag\r
@@ -1626,13 +1863,14 @@ CVfrDataStorage::DeclareEfiVarStore (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::DeclareBufferVarStore (\r
-  IN CHAR8             *StoreName, \r
-  IN EFI_GUID          *Guid, \r
+  IN CHAR8             *StoreName,\r
+  IN EFI_GUID          *Guid,\r
   IN CVfrVarDataTypeDB *DataTypeDB,\r
   IN CHAR8             *TypeName,\r
   IN EFI_VARSTORE_ID   VarStoreId,\r
+  IN BOOLEAN           IsBitVarStore,\r
   IN BOOLEAN           Flag\r
   )\r
 {\r
@@ -1659,7 +1897,7 @@ CVfrDataStorage::DeclareBufferVarStore (
     MarkVarStoreIdUsed (VarStoreId);\r
   }\r
 \r
-  if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, Flag)) == NULL) {\r
+  if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, IsBitVarStore, Flag)) == NULL) {\r
     return VFR_RETURN_OUT_FOR_RESOURCES;\r
   }\r
 \r
@@ -1673,7 +1911,7 @@ CVfrDataStorage::DeclareBufferVarStore (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetVarStoreByDataType (\r
   IN  CHAR8              *DataTypeName,\r
   OUT SVfrVarStorageNode **VarNode,\r
@@ -1682,7 +1920,7 @@ CVfrDataStorage::GetVarStoreByDataType (
 {\r
   SVfrVarStorageNode    *pNode;\r
   SVfrVarStorageNode    *MatchNode;\r
-  \r
+\r
   //\r
   // Framework VFR uses Data type name as varstore name, so don't need check again.\r
   //\r
@@ -1712,7 +1950,7 @@ CVfrDataStorage::GetVarStoreByDataType (
       }\r
     }\r
   }\r
-  \r
+\r
   if (MatchNode == NULL) {\r
     return VFR_RETURN_UNDEFINED;\r
   }\r
@@ -1721,7 +1959,7 @@ CVfrDataStorage::GetVarStoreByDataType (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VARSTORE_ID \r
+EFI_VARSTORE_ID\r
 CVfrDataStorage::CheckGuidField (\r
   IN  SVfrVarStorageNode   *pNode,\r
   IN  EFI_GUID             *StoreGuid,\r
@@ -1761,7 +1999,7 @@ CVfrDataStorage::CheckGuidField (
 }\r
 \r
 /**\r
-  Base on the input store name and guid to find the varstore id. \r
+  Base on the input store name and guid to find the varstore id.\r
 \r
   If both name and guid are inputed, base on the name and guid to\r
   found the varstore. If only name inputed, base on the name to\r
@@ -1769,10 +2007,10 @@ CVfrDataStorage::CheckGuidField (
   has the same name. If only has found one varstore, return this\r
   varstore; if more than one varstore has same name, return varstore\r
   name redefined error. If no varstore found by varstore name, call\r
-  function GetVarStoreByDataType and use inputed varstore name as \r
+  function GetVarStoreByDataType and use inputed varstore name as\r
   data type name to search.\r
 **/\r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetVarStoreId (\r
   IN  CHAR8           *StoreName,\r
   OUT EFI_VARSTORE_ID *VarStoreId,\r
@@ -1820,14 +2058,14 @@ CVfrDataStorage::GetVarStoreId (
   *VarStoreId         = EFI_VARSTORE_ID_INVALID;\r
 \r
   //\r
-  // Assume that Data strucutre name is used as StoreName, and check again. \r
+  // Assume that Data structure name is used as StoreName, and check again.\r
   //\r
   ReturnCode = GetVarStoreByDataType (StoreName, &pNode, StoreGuid);\r
   if (pNode != NULL) {\r
     mCurrVarStorageNode = pNode;\r
     *VarStoreId = pNode->mVarStoreId;\r
   }\r
-  \r
+\r
   return ReturnCode;\r
 }\r
 \r
@@ -1931,7 +2169,7 @@ CVfrDataStorage::GetVarStoreGuid (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetVarStoreName (\r
-  IN  EFI_VARSTORE_ID VarStoreId, \r
+  IN  EFI_VARSTORE_ID VarStoreId,\r
   OUT CHAR8           **VarStoreName\r
   )\r
 {\r
@@ -2056,7 +2294,7 @@ CVfrDataStorage::GetNameVarStoreInfo (
   if (mCurrVarStorageNode == NULL) {\r
     return VFR_RETURN_GET_NVVARSTORE_ERROR;\r
   }\r
-  \r
+\r
   //\r
   // Framework Vfr file Index is from 1, but Uefi Vfr file Index is from 0.\r
   //\r
@@ -2074,8 +2312,8 @@ CVfrDataStorage::GetNameVarStoreInfo (
 \r
 SVfrDefaultStoreNode::SVfrDefaultStoreNode (\r
   IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,\r
-  IN CHAR8                *RefName, \r
-  IN EFI_STRING_ID        DefaultStoreNameId, \r
+  IN CHAR8                *RefName,\r
+  IN EFI_STRING_ID        DefaultStoreNameId,\r
   IN UINT16               DefaultId\r
   )\r
 {\r
@@ -2098,7 +2336,7 @@ SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
   )\r
 {\r
   if (mRefName != NULL) {\r
-    delete mRefName;\r
+    delete[] mRefName;\r
   }\r
 }\r
 \r
@@ -2153,7 +2391,7 @@ CVfrDefaultStore::RegisterDefaultStore (
 }\r
 \r
 /*\r
- * assign new reference name or new default store name id only if \r
+ * assign new reference name or new default store name id only if\r
  * the original is invalid\r
  */\r
 EFI_VFR_RETURN_CODE\r
@@ -2269,7 +2507,7 @@ CVfrDefaultStore::BufferVarStoreAltConfigAdd (
       goto WriteError;\r
     }\r
   }\r
-  \r
+\r
   gCVfrBufferConfig.Close ();\r
 \r
   return VFR_RETURN_SUCCESS;\r
@@ -2300,7 +2538,7 @@ SVfrRuleNode::~SVfrRuleNode (
   )\r
 {\r
   if (mRuleName != NULL) {\r
-    delete mRuleName;\r
+    delete[] mRuleName;\r
   }\r
 }\r
 \r
@@ -2373,6 +2611,7 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
   mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
   mVarType         = EFI_IFR_TYPE_OTHER;\r
   mVarTotalSize    = 0;\r
+  mIsBitVar        = FALSE;\r
 }\r
 \r
 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
@@ -2384,6 +2623,24 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
   mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
   mVarType         = Info.mVarType;\r
   mVarTotalSize    = Info.mVarTotalSize;\r
+  mIsBitVar        = Info.mIsBitVar;\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
+    mIsBitVar        = Info.mIsBitVar;\r
+  }\r
+\r
+  return *this;\r
 }\r
 \r
 BOOLEAN\r
@@ -2392,10 +2649,11 @@ EFI_VARSTORE_INFO::operator == (
   )\r
 {\r
   if ((mVarStoreId == Info->mVarStoreId) &&\r
-         (mInfo.mVarName == Info->mInfo.mVarName) &&\r
+      (mInfo.mVarName == Info->mInfo.mVarName) &&\r
       (mInfo.mVarOffset == Info->mInfo.mVarOffset) &&\r
       (mVarType == Info->mVarType) &&\r
-      (mVarTotalSize == Info->mVarTotalSize)) {\r
+      (mVarTotalSize == Info->mVarTotalSize) &&\r
+      (mIsBitVar == Info->mIsBitVar)) {\r
     return TRUE;\r
   }\r
 \r
@@ -2437,6 +2695,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
@@ -2515,11 +2777,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
@@ -2570,7 +2832,7 @@ CVfrQuestionDB::ResetInit(
 \r
   // Question ID 0 is reserved.\r
   mFreeQIdBitMap[0] = 0x80000000;\r
-  mQuestionList     = NULL;   \r
+  mQuestionList     = NULL;\r
 }\r
 \r
 VOID\r
@@ -2581,7 +2843,7 @@ CVfrQuestionDB::PrintAllQuestion (
   SVfrQuestionNode *pNode = NULL;\r
 \r
   for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
-    printf ("Question VarId is %s and QuesitonId is 0x%x\n", pNode->mVarIdStr, pNode->mQuestionId);\r
+    printf ("Question VarId is %s and QuestionId is 0x%x\n", pNode->mVarIdStr, pNode->mQuestionId);\r
   }\r
 }\r
 \r
@@ -2778,7 +3040,8 @@ CVfrQuestionDB::RegisterNewDateQuestion (
 \r
   for (Index = 0; Index < 3; Index++) {\r
     if (VarIdStr[Index] != NULL) {\r
-      delete VarIdStr[Index];\r
+      delete[] VarIdStr[Index];\r
+      VarIdStr[Index] = NULL;\r
     }\r
   }\r
 \r
@@ -2795,7 +3058,8 @@ Err:
     }\r
 \r
     if (VarIdStr[Index] != NULL) {\r
-      delete VarIdStr[Index];\r
+      delete[] VarIdStr [Index];\r
+      VarIdStr [Index] = NULL;\r
     }\r
   }\r
 }\r
@@ -2954,7 +3218,8 @@ CVfrQuestionDB::RegisterNewTimeQuestion (
 \r
   for (Index = 0; Index < 3; Index++) {\r
     if (VarIdStr[Index] != NULL) {\r
-      delete VarIdStr[Index];\r
+      delete[] VarIdStr[Index];\r
+      VarIdStr[Index] = NULL;\r
     }\r
   }\r
 \r
@@ -2971,12 +3236,13 @@ Err:
     }\r
 \r
     if (VarIdStr[Index] != NULL) {\r
-      delete VarIdStr[Index];\r
+      delete[] VarIdStr[Index];\r
+      VarIdStr[Index] = NULL;\r
     }\r
   }\r
 }\r
 \r
-VOID \r
+VOID\r
 CVfrQuestionDB::RegisterRefQuestion (\r
   IN     CHAR8           *Name,\r
   IN     CHAR8           *BaseVarId,\r
@@ -3065,15 +3331,15 @@ CVfrQuestionDB::RegisterRefQuestion (
   pNode[0]->mQuestionId = QuestionId;\r
   pNode[1]->mQuestionId = QuestionId;\r
   pNode[2]->mQuestionId = QuestionId;\r
-  pNode[3]->mQuestionId = QuestionId;  \r
+  pNode[3]->mQuestionId = QuestionId;\r
   pNode[0]->mQtype      = QUESTION_REF;\r
   pNode[1]->mQtype      = QUESTION_REF;\r
   pNode[2]->mQtype      = QUESTION_REF;\r
-  pNode[3]->mQtype      = QUESTION_REF;  \r
+  pNode[3]->mQtype      = QUESTION_REF;\r
   pNode[0]->mNext       = pNode[1];\r
   pNode[1]->mNext       = pNode[2];\r
   pNode[2]->mNext       = pNode[3];\r
-  pNode[3]->mNext       = mQuestionList;  \r
+  pNode[3]->mNext       = mQuestionList;\r
   mQuestionList         = pNode[0];\r
 \r
   gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
@@ -3102,15 +3368,15 @@ CVfrQuestionDB::UpdateQuestionId (
   )\r
 {\r
   SVfrQuestionNode *pNode = NULL;\r
-  \r
+\r
   if (QId == NewQId) {\r
     // don't update\r
     return VFR_RETURN_SUCCESS;\r
   }\r
-  \r
+\r
   //\r
   // For Framework Vfr, don't check question ID conflict.\r
-  //  \r
+  //\r
   if (!VfrCompatibleMode && ChekQuestionIdFree (NewQId) == FALSE) {\r
     return VFR_RETURN_REDEFINED;\r
   }\r
@@ -3166,7 +3432,7 @@ CVfrQuestionDB::GetQuestionId (
       if (strcmp (pNode->mVarIdStr, VarIdStr) != 0) {\r
         continue;\r
       }\r
-       }\r
+    }\r
 \r
     QuestionId = pNode->mQuestionId;\r
     BitMask    = pNode->mBitMask;\r
@@ -3227,13 +3493,13 @@ CVfrStringDB::CVfrStringDB ()
 CVfrStringDB::~CVfrStringDB ()\r
 {\r
   if (mStringFileName != NULL) {\r
-    delete mStringFileName;\r
+    delete[] mStringFileName;\r
   }\r
   mStringFileName = NULL;\r
 }\r
 \r
 \r
-VOID \r
+VOID\r
 CVfrStringDB::SetStringFileName(IN CHAR8 *StringFileName)\r
 {\r
   UINT32 FileLen = 0;\r
@@ -3242,6 +3508,10 @@ CVfrStringDB::SetStringFileName(IN CHAR8 *StringFileName)
     return;\r
   }\r
 \r
+  if (mStringFileName != NULL) {\r
+    delete[] mStringFileName;\r
+  }\r
+\r
   FileLen = strlen (StringFileName) + 1;\r
   mStringFileName = new CHAR8[FileLen];\r
   if (mStringFileName == NULL) {\r
@@ -3254,7 +3524,7 @@ CVfrStringDB::SetStringFileName(IN CHAR8 *StringFileName)
 \r
 \r
 /**\r
-  Returns TRUE or FALSE whether SupportedLanguages contains the best matching language \r
+  Returns TRUE or FALSE whether SupportedLanguages contains the best matching language\r
   from a set of supported languages.\r
 \r
   @param[in]  SupportedLanguages  A pointer to a Null-terminated ASCII string that\r
@@ -3317,13 +3587,13 @@ CVfrStringDB::GetBestLanguage (
     }\r
 \r
     //\r
-    // Trim Language from the right to the next '-' character \r
+    // Trim Language from the right to the next '-' character\r
     //\r
     for (LanguageLength--; LanguageLength > 0 && Language[LanguageLength] != '-'; LanguageLength--);\r
   }\r
 \r
   //\r
-  // No matches were found \r
+  // No matches were found\r
   //\r
   return FALSE;\r
 }\r
@@ -3347,8 +3617,8 @@ CVfrStringDB::GetVarStoreNameFormStringId (
   CHAR8       LineBuf[EFI_IFR_MAX_LENGTH];\r
   UINT8       BlockType;\r
   EFI_HII_STRING_PACKAGE_HDR *PkgHeader;\r
-  \r
-  if (mStringFileName == '\0' ) {\r
+\r
+  if (mStringFileName == NULL) {\r
     return NULL;\r
   }\r
 \r
@@ -3379,7 +3649,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
@@ -3406,7 +3676,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
@@ -3439,7 +3709,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
     break;\r
   }\r
 \r
-  delete StringPtr;\r
+  delete[] StringPtr;\r
 \r
   return VarStoreName;\r
 }\r