]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Hand/Handle.c
MdeModulePkg/Core/Dxe: Acquire a lock when iterating gHandleList
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Hand / Handle.c
index 6eccb41ecb5cfcb09a03fcb2e06b26271e43b64d..92979281b74a2a76e0f77c067660d3542329d712 100644 (file)
@@ -53,6 +53,7 @@ CoreReleaseProtocolLock (
 \r
 /**\r
   Check whether a handle is a valid EFI_HANDLE\r
+  The gProtocolDatabaseLock must be owned\r
 \r
   @param  UserHandle             The handle to check\r
 \r
@@ -72,6 +73,8 @@ CoreValidateHandle (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  ASSERT_LOCKED(&gProtocolDatabaseLock);\r
+\r
   for (Link = gHandleList.BackLink; Link != &gHandleList; Link = Link->BackLink) {\r
     Handle = CR (Link, IHANDLE, AllHandles, EFI_HANDLE_SIGNATURE);\r
     if (Handle == (IHANDLE *) UserHandle) {\r
@@ -720,19 +723,19 @@ CoreUninstallProtocolInterface (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // Lock the protocol database\r
+  //\r
+  CoreAcquireProtocolLock ();\r
+\r
   //\r
   // Check that UserHandle is a valid handle\r
   //\r
   Status = CoreValidateHandle (UserHandle);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
-  //\r
-  // Lock the protocol database\r
-  //\r
-  CoreAcquireProtocolLock ();\r
-\r
   //\r
   // Check that Protocol exists on UserHandle, and Interface matches the interface in the database\r
   //\r
@@ -1010,12 +1013,17 @@ CoreOpenProtocol (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // Lock the protocol database\r
+  //\r
+  CoreAcquireProtocolLock ();\r
+\r
   //\r
   // Check for invalid UserHandle\r
   //\r
   Status = CoreValidateHandle (UserHandle);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1025,31 +1033,32 @@ CoreOpenProtocol (
   case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER :\r
     Status = CoreValidateHandle (ImageHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
     Status = CoreValidateHandle (ControllerHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
     if (UserHandle == ControllerHandle) {\r
-      return EFI_INVALID_PARAMETER;\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto Done;\r
     }\r
     break;\r
   case EFI_OPEN_PROTOCOL_BY_DRIVER :\r
   case EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE :\r
     Status = CoreValidateHandle (ImageHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
     Status = CoreValidateHandle (ControllerHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
     break;\r
   case EFI_OPEN_PROTOCOL_EXCLUSIVE :\r
     Status = CoreValidateHandle (ImageHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
     break;\r
   case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL :\r
@@ -1057,13 +1066,10 @@ CoreOpenProtocol (
   case EFI_OPEN_PROTOCOL_TEST_PROTOCOL :\r
     break;\r
   default:\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
-  //\r
-  // Lock the protocol database\r
-  //\r
-  CoreAcquireProtocolLock ();\r
 \r
   //\r
   // Look at each protocol interface for a match\r
@@ -1246,32 +1252,33 @@ CoreCloseProtocol (
   LIST_ENTRY          *Link;\r
   OPEN_PROTOCOL_DATA  *OpenData;\r
 \r
+  //\r
+  // Lock the protocol database\r
+  //\r
+  CoreAcquireProtocolLock ();\r
+\r
   //\r
   // Check for invalid parameters\r
   //\r
   Status = CoreValidateHandle (UserHandle);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
   Status = CoreValidateHandle (AgentHandle);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
   if (ControllerHandle != NULL) {\r
     Status = CoreValidateHandle (ControllerHandle);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
   }\r
   if (Protocol == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
-  //\r
-  // Lock the protocol database\r
-  //\r
-  CoreAcquireProtocolLock ();\r
-\r
   //\r
   // Look at each protocol interface for a match\r
   //\r
@@ -1443,13 +1450,6 @@ CoreProtocolsPerHandle (
   UINTN                               ProtocolCount;\r
   EFI_GUID                            **Buffer;\r
 \r
-  Status = CoreValidateHandle (UserHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Handle = (IHANDLE *)UserHandle;\r
-\r
   if (ProtocolBuffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
@@ -1464,6 +1464,13 @@ CoreProtocolsPerHandle (
 \r
   CoreAcquireProtocolLock ();\r
 \r
+  Status = CoreValidateHandle (UserHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  Handle = (IHANDLE *)UserHandle;\r
+\r
   for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
     ProtocolCount++;\r
   }\r