]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmulatorPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystem.c
EmulatorPkg/EmuFileSystem: Fix a bug that causes Close() assertion
[mirror_edk2.git] / EmulatorPkg / EmuSimpleFileSystemDxe / EmuSimpleFileSystem.c
index 4709f7a46f15a572cafb77eee865c1ba87ecdcf4..b5e19bb840a38d9eff1c7fa0cecf7d1b2fe105e3 100644 (file)
@@ -4,7 +4,7 @@
   environment variables. The variables must be visible to the Microsoft*\r
   Developer Studio for them to work.\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -51,7 +51,10 @@ EmuSimpleFileSystemOpen (
   IN  UINT64              Attributes\r
   )\r
 {\r
+  EFI_STATUS                        Status;\r
+  EFI_TPL                           OldTpl;\r
   EMU_EFI_FILE_PRIVATE              *PrivateFile;\r
+  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;\r
 \r
   //\r
   // Check for obvious invalid parameters.\r
@@ -81,9 +84,29 @@ EmuSimpleFileSystemOpen (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  NewPrivateFile = AllocateCopyPool (sizeof (EMU_EFI_FILE_PRIVATE), PrivateFile);\r
+  if (NewPrivateFile == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+\r
 \r
-  return PrivateFile->Io->Open (PrivateFile->Io, NewHandle, FileName, OpenMode, Attributes);\r
+  Status = PrivateFile->Io->Open (PrivateFile->Io, &NewPrivateFile->Io, FileName, OpenMode, Attributes);\r
+  if (!EFI_ERROR (Status)) {\r
+    *NewHandle = &NewPrivateFile->EfiFile;\r
+  } else {\r
+    *NewHandle = NULL;\r
+    FreePool (NewPrivateFile);\r
+  }\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 \r
@@ -508,7 +531,9 @@ EmuSimpleFileSystemOpenVolume (
   PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;\r
   PrivateFile->IoThunk              = Private->IoThunk;\r
   PrivateFile->SimpleFileSystem     = This;\r
-  PrivateFile->EfiFile.Revision     = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;\r
+\r
+  ZeroMem (&PrivateFile->EfiFile, sizeof (PrivateFile->EfiFile));\r
+  PrivateFile->EfiFile.Revision     = EFI_FILE_PROTOCOL_REVISION;\r
   PrivateFile->EfiFile.Open         = EmuSimpleFileSystemOpen;\r
   PrivateFile->EfiFile.Close        = EmuSimpleFileSystemClose;\r
   PrivateFile->EfiFile.Delete       = EmuSimpleFileSystemDelete;\r