\r
This code checks if variable header is valid or not.\r
\r
- @param Variable Pointer to the Variable Header.\r
+ @param Variable Pointer to the Variable Header.\r
+ @param VariableStoreEnd Pointer to the Variable Store End.\r
\r
- @retval TRUE Variable header is valid.\r
- @retval FALSE Variable header is not valid.\r
+ @retval TRUE Variable header is valid.\r
+ @retval FALSE Variable header is not valid.\r
\r
**/\r
BOOLEAN\r
IsValidVariableHeader (\r
- IN VARIABLE_HEADER *Variable\r
+ IN VARIABLE_HEADER *Variable,\r
+ IN VARIABLE_HEADER *VariableStoreEnd\r
)\r
{\r
- if (Variable == NULL || Variable->StartId != VARIABLE_DATA) {\r
+ if ((Variable == NULL) || (Variable >= VariableStoreEnd) || (Variable->StartId != VARIABLE_DATA)) {\r
+ //\r
+ // Variable is NULL or has reached the end of variable store,\r
+ // or the StartId is not correct.\r
+ //\r
return FALSE;\r
}\r
\r
{\r
UINTN Value;\r
\r
- if (!IsValidVariableHeader (Variable)) {\r
- return NULL;\r
- }\r
-\r
Value = (UINTN) GetVariableDataPtr (Variable);\r
Value += DataSizeOfVariable (Variable);\r
Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
)\r
{\r
VARIABLE_HEADER *Variable;\r
+ VARIABLE_HEADER *VariableStoreEnd;\r
\r
if (PubKeyIndex > mPubKeyNumber) {\r
return FALSE;\r
}\r
- \r
+\r
Variable = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase);\r
- \r
- while (IsValidVariableHeader (Variable)) {\r
+ VariableStoreEnd = GetEndPointer ((VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase);\r
+\r
+ while (IsValidVariableHeader (Variable, VariableStoreEnd)) {\r
if ((Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) && \r
Variable->PubKeyIndex == PubKeyIndex) {\r
return TRUE;\r
Variable = GetStartPointer (VariableStoreHeader);\r
MaximumBufferSize = sizeof (VARIABLE_STORE_HEADER);\r
\r
- while (IsValidVariableHeader (Variable)) {\r
+ while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
NextVariable = GetNextVariablePtr (Variable);\r
if ((Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) &&\r
Variable != UpdatingVariable &&\r
// Refresh the PubKeyIndex for all valid variables (ADDED and IN_DELETED_TRANSITION).\r
//\r
Variable = GetStartPointer (VariableStoreHeader);\r
- while (IsValidVariableHeader (Variable)) {\r
+ while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
NextVariable = GetNextVariablePtr (Variable);\r
if (Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
if ((StrCmp (GetVariableNamePtr (Variable), AUTHVAR_KEYDB_NAME) == 0) && \r
// Reinstall all ADDED variables as long as they are not identical to Updating Variable.\r
//\r
Variable = GetStartPointer (VariableStoreHeader);\r
- while (IsValidVariableHeader (Variable)) {\r
+ while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
NextVariable = GetNextVariablePtr (Variable);\r
if (Variable != UpdatingVariable && Variable->State == VAR_ADDED) {\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
// Reinstall all in delete transition variables.\r
//\r
Variable = GetStartPointer (VariableStoreHeader);\r
- while (IsValidVariableHeader (Variable)) {\r
+ while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
NextVariable = GetNextVariablePtr (Variable);\r
if (Variable != UpdatingVariable && Variable != UpdatingInDeletedTransition && Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
\r
\r
FoundAdded = FALSE;\r
AddedVariable = GetStartPointer ((VARIABLE_STORE_HEADER *) ValidBuffer);\r
- while (IsValidVariableHeader (AddedVariable)) {\r
+ while (IsValidVariableHeader (AddedVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) ValidBuffer))) {\r
NextAddedVariable = GetNextVariablePtr (AddedVariable);\r
NameSize = NameSizeOfVariable (AddedVariable);\r
if (CompareGuid (&AddedVariable->VendorGuid, &Variable->VendorGuid) &&\r
mVariableModuleGlobal->CommonVariableTotalSize = CommonVariableTotalSize;\r
} else {\r
NextVariable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase);\r
- while (IsValidVariableHeader (NextVariable)) {\r
+ while (IsValidVariableHeader (NextVariable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase))) {\r
VariableSize = NextVariable->NameSize + NextVariable->DataSize + sizeof (VARIABLE_HEADER);\r
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
mVariableModuleGlobal->HwErrVariableTotalSize += HEADER_ALIGN (VariableSize);\r
InDeletedVariable = NULL;\r
\r
for ( PtrTrack->CurrPtr = PtrTrack->StartPtr\r
- ; (PtrTrack->CurrPtr < PtrTrack->EndPtr) && IsValidVariableHeader (PtrTrack->CurrPtr)\r
+ ; IsValidVariableHeader (PtrTrack->CurrPtr, PtrTrack->EndPtr)\r
; PtrTrack->CurrPtr = GetNextVariablePtr (PtrTrack->CurrPtr)\r
) {\r
if (PtrTrack->CurrPtr->State == VAR_ADDED ||\r
//\r
// Switch from Volatile to HOB, to Non-Volatile.\r
//\r
- while ((Variable.CurrPtr >= Variable.EndPtr) ||\r
- (Variable.CurrPtr == NULL) ||\r
- !IsValidVariableHeader (Variable.CurrPtr)\r
- ) {\r
+ while (!IsValidVariableHeader (Variable.CurrPtr, Variable.EndPtr)) {\r
//\r
// Find current storage index\r
//\r
// Parse non-volatile variable data and get last variable offset.\r
//\r
NextVariable = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point);\r
- while ((NextVariable < GetEndPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point))\r
- && IsValidVariableHeader (NextVariable)) {\r
+ while (IsValidVariableHeader (NextVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point))) {\r
NextVariable = GetNextVariablePtr (NextVariable);\r
}\r
mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) NextVariable - (UINTN) Point;\r
//\r
// Now walk through the related variable store.\r
//\r
- while ((Variable < GetEndPointer (VariableStoreHeader)) && IsValidVariableHeader (Variable)) {\r
+ while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
NextVariable = GetNextVariablePtr (Variable);\r
VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;\r
\r
// Parse non-volatile variable data and get last variable offset.\r
//\r
NextVariable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase);\r
- while (IsValidVariableHeader (NextVariable)) {\r
+ while (IsValidVariableHeader (NextVariable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase))) {\r
VariableSize = NextVariable->NameSize + NextVariable->DataSize + sizeof (VARIABLE_HEADER);\r
if ((NextVariable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
mVariableModuleGlobal->HwErrVariableTotalSize += HEADER_ALIGN (VariableSize);\r
//\r
mVariableModuleGlobal->VariableGlobal.HobVariableBase = 0;\r
for ( Variable = GetStartPointer (VariableStoreHeader)\r
- ; (Variable < GetEndPointer (VariableStoreHeader) && IsValidVariableHeader (Variable))\r
+ ; IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))\r
; Variable = GetNextVariablePtr (Variable)\r
) {\r
if (Variable->State != VAR_ADDED) {\r