]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.c
SecurityPkg Variable: Enhance the code logic about VariableLock
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / RuntimeDxe / Variable.c
index ec857665fda4d442aecec3a410a1c0961e45a14f..7ecc29b94b5766323dd275a242fd174c8ec28a5e 100644 (file)
@@ -2839,6 +2839,8 @@ VariableLockRequestToLock (
 {\r
   VARIABLE_ENTRY                  *Entry;\r
   CHAR16                          *Name;\r
+  LIST_ENTRY                      *Link;\r
+  VARIABLE_ENTRY                  *LockedEntry;\r
 \r
   if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -2857,11 +2859,23 @@ VariableLockRequestToLock (
 \r
   AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
 \r
+  for ( Link = GetFirstNode (&mLockedVariableList)\r
+      ; !IsNull (&mLockedVariableList, Link)\r
+      ; Link = GetNextNode (&mLockedVariableList, Link)\r
+      ) {\r
+    LockedEntry = BASE_CR (Link, VARIABLE_ENTRY, Link);\r
+    Name = (CHAR16 *) ((UINTN) LockedEntry + sizeof (*LockedEntry));\r
+    if (CompareGuid (&LockedEntry->Guid, VendorGuid) && (StrCmp (Name, VariableName) == 0)) {\r
+      goto Done;\r
+    }\r
+  }\r
+\r
   Name = (CHAR16 *) ((UINTN) Entry + sizeof (*Entry));\r
   StrnCpy   (Name, VariableName, StrLen (VariableName));\r
   CopyGuid (&Entry->Guid, VendorGuid);\r
   InsertTailList (&mLockedVariableList, &Entry->Link);\r
 \r
+Done:\r
   ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
 \r
   return EFI_SUCCESS;\r