//\r
\r
//\r
- // Reinstall all ADDED variables\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
NextVariable = GetNextVariablePtr (Variable);\r
if (Variable->State == VAR_ADDED) {\r
+ if (UpdatingVariable != NULL) {\r
+ if (UpdatingVariable == Variable) {\r
+ Variable = NextVariable;\r
+ continue;\r
+ }\r
+ if (CompareGuid (&Variable->VendorGuid, &UpdatingVariable->VendorGuid) &&\r
+ NameSizeOfVariable(Variable) == NameSizeOfVariable (UpdatingVariable) &&\r
+ CompareMem (GetVariableNamePtr (Variable), GetVariableNamePtr (UpdatingVariable), NameSizeOfVariable (Variable)) == 0 ) {\r
+ Variable = NextVariable;\r
+ continue;\r
+ }\r
+ }\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
CurrPtr += VariableSize;\r
}\r
-\r
Variable = NextVariable;\r
}\r
+\r
+ //\r
+ // Reinstall the variable being updated if it is not NULL\r
+ //\r
+ if (UpdatingVariable != NULL) {\r
+ VariableSize = (UINTN)(GetNextVariablePtr (UpdatingVariable)) - (UINTN)UpdatingVariable;\r
+ CopyMem (CurrPtr, (UINT8 *) UpdatingVariable, VariableSize);\r
+ CurrPtr += VariableSize;\r
+ }\r
+\r
//\r
// Reinstall all in delete transition variables\r
// \r
Variable = GetStartPointer (VariableStoreHeader);\r
while (IsValidVariableHeader (Variable)) {\r
NextVariable = GetNextVariablePtr (Variable);\r
- if (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
+ if (Variable != UpdatingVariable && Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
\r
//\r
// Buffer has cached all ADDED variable. \r
) {\r
Point0 = (VOID *) GetVariableNamePtr (AddedVariable);\r
Point1 = (VOID *) GetVariableNamePtr (Variable);\r
- if (!CompareMem (\r
- Point0,\r
- Point1,\r
- NameSizeOfVariable (AddedVariable)\r
- )\r
- ) {\r
+ if (CompareMem (Point0, Point1, NameSizeOfVariable (AddedVariable)) == 0) {\r
FoundAdded = TRUE;\r
break;\r
}\r
AddedVariable = NextAddedVariable;\r
}\r
if (!FoundAdded) {\r
+ //\r
+ // Promote VAR_IN_DELETED_TRANSITION to VAR_ADDED\r
+ //\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
- if (Variable != UpdatingVariable) {\r
- ((VARIABLE_HEADER *) CurrPtr)->State = VAR_ADDED;\r
- }\r
+ ((VARIABLE_HEADER *) CurrPtr)->State = VAR_ADDED;\r
CurrPtr += VariableSize;\r
}\r
}\r