]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
Align the header of variable from 1 to 4, which can avoid the size of variable conten...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / VariablePei / Variable.c
index 46c898609a85760168fe6a4b499b0f154e6dd0cf..e050fbcf9d3f3edea3a43744ee5a813e370f0082 100644 (file)
@@ -80,6 +80,59 @@ Returns:
 \r
 }\r
 \r
+\r
+UINT32\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->NameSize;\r
+}\r
+\r
+UINT32\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->DataSize;\r
+}\r
+\r
+UINT32\r
+AttributesOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->Attributes;\r
+}\r
+\r
 STATIC\r
 VARIABLE_HEADER *\r
 GetNextVariablePtr (\r
@@ -100,7 +153,7 @@ Returns:
 \r
 --*/\r
 {\r
-  return (VARIABLE_HEADER *) ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DataSizeOfVariable (Variable) + GET_PAD_SIZE (DataSizeOfVariable (Variable)));\r
 }\r
 \r
 STATIC\r
@@ -124,10 +177,7 @@ Returns:
 \r
 --*/\r
 {\r
-  if (Variable == NULL ||\r
-      Variable->StartId != VARIABLE_DATA ||\r
-      (sizeof (VARIABLE_HEADER) + Variable->DataSize + Variable->NameSize) > MAX_VARIABLE_SIZE\r
-      ) {\r
+  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
     return FALSE;\r
   }\r
 \r
@@ -221,7 +271,8 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -290,7 +341,6 @@ Returns:
     for (Count = 0; Count < IndexTable->Length; Count++)\r
     {\r
       MaxIndex = GetVariableByIndex (IndexTable, Count);\r
-\r
       if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
         PtrTrack->StartPtr  = IndexTable->StartPtr;\r
         PtrTrack->EndPtr    = IndexTable->EndPtr;\r
@@ -429,7 +479,7 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = Variable.CurrPtr->DataSize;\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
     (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
 \r
@@ -555,7 +605,9 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        VarNameSize = (UINTN) Variable.CurrPtr->NameSize;\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
+\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
           (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
 \r