]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c
MdeModulePkg: Fix spelling mistake for occurred
[mirror_edk2.git] / MdeModulePkg / Universal / FvSimpleFileSystemDxe / FvSimpleFileSystem.c
index 9661cfd1321b905e55f9ec864f1930a9d36f3346..f33f7f7216c3881e319414ffdfd686d4e2105b95 100644 (file)
   from the UEFI shell. It is entirely read-only.\r
 \r
 Copyright (c) 2014, ARM Limited. All rights reserved.\r
-Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -139,7 +133,7 @@ FvFsGetFileSize (
     //\r
     // Get the size of the first executable section out of the file.\r
     //\r
-    Status = FvFsFindExecutableSection (FvProtocol, FvFileInfo, &FvFileInfo->FileInfo.FileSize, &IgnoredPtr);\r
+    Status = FvFsFindExecutableSection (FvProtocol, FvFileInfo, (UINTN*)&FvFileInfo->FileInfo.FileSize, &IgnoredPtr);\r
     if (Status == EFI_WARN_BUFFER_TOO_SMALL) {\r
       return EFI_SUCCESS;\r
     }\r
@@ -153,7 +147,7 @@ FvFsGetFileSize (
                            EFI_SECTION_RAW,\r
                            0,\r
                            &IgnoredPtr,\r
-                           &FvFileInfo->FileInfo.FileSize,\r
+                           (UINTN*)&FvFileInfo->FileInfo.FileSize,\r
                            &AuthenticationStatus\r
                            );\r
     if (Status == EFI_WARN_BUFFER_TOO_SMALL) {\r
@@ -167,7 +161,7 @@ FvFsGetFileSize (
                            FvProtocol,\r
                            &FvFileInfo->NameGuid,\r
                            NULL,\r
-                           &FvFileInfo->FileInfo.FileSize,\r
+                           (UINTN*)&FvFileInfo->FileInfo.FileSize,\r
                            &FoundType,\r
                            &Attributes,\r
                            &AuthenticationStatus\r
@@ -181,7 +175,7 @@ FvFsGetFileSize (
                          FvProtocol,\r
                          &FvFileInfo->NameGuid,\r
                          NULL,\r
-                         &FvFileInfo->FileInfo.FileSize,\r
+                         (UINTN*)&FvFileInfo->FileInfo.FileSize,\r
                          &FoundType,\r
                          &Attributes,\r
                          &AuthenticationStatus\r
@@ -303,7 +297,7 @@ FvFsGetFileInfo (
 {\r
   UINTN                      InfoSize;\r
 \r
-  InfoSize = FvFileInfo->FileInfo.Size;\r
+  InfoSize = (UINTN)FvFileInfo->FileInfo.Size;\r
   if (*BufferSize < InfoSize) {\r
     *BufferSize = InfoSize;\r
     return EFI_BUFFER_TOO_SMALL;\r
@@ -368,7 +362,7 @@ RemoveLastItemFromPath (
 \r
   @param  Path          The pointer to the string containing the path.\r
 \r
-  @retval NULL          An error occured.\r
+  @retval NULL          An error occurred.\r
   @return Path in all other instances.\r
 \r
 **/\r
@@ -483,6 +477,10 @@ FvSimpleFileSystemOpen (
   FV_FILESYSTEM_FILE          *NewFile;\r
   FV_FILESYSTEM_FILE_INFO     *FvFileInfo;\r
   LIST_ENTRY                  *FvFileInfoLink;\r
+  EFI_STATUS                  Status;\r
+  UINTN                       FileNameLength;\r
+  UINTN                       NewFileNameLength;\r
+  CHAR16                      *FileNameWithExtension;\r
 \r
   //\r
   // Check for a valid mode\r
@@ -499,6 +497,9 @@ FvSimpleFileSystemOpen (
   Instance = File->Instance;\r
 \r
   FileName = TrimFilePathToAbsolutePath (FileName);\r
+  if (FileName == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   if (FileName[0] == L'\\') {\r
     FileName++;\r
@@ -519,7 +520,10 @@ FvSimpleFileSystemOpen (
     InitializeListHead (&NewFile->Link);\r
     InsertHeadList (&Instance->FileHead, &NewFile->Link);\r
 \r
-    NewFile->DirReadNext = FVFS_GET_FIRST_FILE_INFO (Instance);\r
+    NewFile->DirReadNext = NULL;\r
+    if (!IsListEmpty (&Instance->FileInfoHead)) {\r
+      NewFile->DirReadNext = FVFS_GET_FIRST_FILE_INFO (Instance);\r
+    }\r
 \r
     *NewHandle = &NewFile->FileProtocol;\r
     return EFI_SUCCESS;\r
@@ -528,26 +532,61 @@ FvSimpleFileSystemOpen (
   //\r
   // Do a linear search for a file in the FV with a matching filename\r
   //\r
+  Status     = EFI_NOT_FOUND;\r
+  FvFileInfo = NULL;\r
   for (FvFileInfoLink = GetFirstNode (&Instance->FileInfoHead);\r
       !IsNull (&Instance->FileInfoHead, FvFileInfoLink);\r
        FvFileInfoLink = GetNextNode (&Instance->FileInfoHead, FvFileInfoLink)) {\r
     FvFileInfo = FVFS_FILE_INFO_FROM_LINK (FvFileInfoLink);\r
     if (mUnicodeCollation->StriColl (mUnicodeCollation, &FvFileInfo->FileInfo.FileName[0], FileName) == 0) {\r
-      NewFile = AllocateZeroPool (sizeof (FV_FILESYSTEM_FILE));\r
-      if (NewFile == NULL) {\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
+      Status = EFI_SUCCESS;\r
+      break;\r
+    }\r
+  }\r
 \r
-      NewFile->Signature = FVFS_FILE_SIGNATURE;\r
-      NewFile->Instance  = Instance;\r
-      NewFile->FvFileInfo = FvFileInfo;\r
-      CopyMem (&NewFile->FileProtocol, &mFileSystemTemplate, sizeof (mFileSystemTemplate));\r
-      InitializeListHead (&NewFile->Link);\r
-      InsertHeadList (&Instance->FileHead, &NewFile->Link);\r
+  // If the file has not been found check if the filename exists with an extension\r
+  // in case there was no extension present.\r
+  // FvFileSystem adds a 'virtual' extension '.EFI' to EFI applications and drivers\r
+  // present in the Firmware Volume\r
+  if (Status == EFI_NOT_FOUND) {\r
+    FileNameLength = StrLen (FileName);\r
+\r
+    // Does the filename already contain the '.EFI' extension?\r
+    if (mUnicodeCollation->StriColl (mUnicodeCollation, FileName + FileNameLength - 4, L".efi") != 0) {\r
+      // No, there was no extension. So add one and search again for the file\r
+      // NewFileNameLength = FileNameLength + 1 + 4 = (Number of non-null character) + (file extension) + (a null character)\r
+      NewFileNameLength = FileNameLength + 1 + 4;\r
+      FileNameWithExtension = AllocatePool (NewFileNameLength * 2);\r
+      StrCpyS (FileNameWithExtension, NewFileNameLength, FileName);\r
+      StrCatS (FileNameWithExtension, NewFileNameLength, L".EFI");\r
+\r
+      for (FvFileInfoLink = GetFirstNode (&Instance->FileInfoHead);\r
+          !IsNull (&Instance->FileInfoHead, FvFileInfoLink);\r
+           FvFileInfoLink = GetNextNode (&Instance->FileInfoHead, FvFileInfoLink)) {\r
+        FvFileInfo = FVFS_FILE_INFO_FROM_LINK (FvFileInfoLink);\r
+        if (mUnicodeCollation->StriColl (mUnicodeCollation, &FvFileInfo->FileInfo.FileName[0], FileNameWithExtension) == 0) {\r
+          Status = EFI_SUCCESS;\r
+          break;\r
+        }\r
+      }\r
+    }\r
+  }\r
 \r
-      *NewHandle = &NewFile->FileProtocol;\r
-      return EFI_SUCCESS;\r
+  if (!EFI_ERROR (Status)) {\r
+    NewFile = AllocateZeroPool (sizeof (FV_FILESYSTEM_FILE));\r
+    if (NewFile == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
+\r
+    NewFile->Signature = FVFS_FILE_SIGNATURE;\r
+    NewFile->Instance  = Instance;\r
+    NewFile->FvFileInfo = FvFileInfo;\r
+    CopyMem (&NewFile->FileProtocol, &mFileSystemTemplate, sizeof (mFileSystemTemplate));\r
+    InitializeListHead (&NewFile->Link);\r
+    InsertHeadList (&Instance->FileHead, &NewFile->Link);\r
+\r
+    *NewHandle = &NewFile->FileProtocol;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   return EFI_NOT_FOUND;\r
@@ -650,7 +689,7 @@ FvSimpleFileSystemRead (
       return EFI_SUCCESS;\r
     }\r
   } else {\r
-    FileSize = File->FvFileInfo->FileInfo.FileSize;\r
+    FileSize = (UINTN)File->FvFileInfo->FileInfo.FileSize;\r
 \r
     FileBuffer = AllocateZeroPool (FileSize);\r
     if (FileBuffer == NULL) {\r
@@ -659,16 +698,19 @@ FvSimpleFileSystemRead (
 \r
     Status = FvFsReadFile (File->Instance->FvProtocol, File->FvFileInfo, &FileSize, &FileBuffer);\r
     if (EFI_ERROR (Status)) {\r
+      FreePool (FileBuffer);\r
       return EFI_DEVICE_ERROR;\r
     }\r
 \r
     if (*BufferSize + File->Position > FileSize) {\r
-      *BufferSize = FileSize - File->Position;\r
+      *BufferSize = (UINTN)(FileSize - File->Position);\r
     }\r
 \r
     CopyMem (Buffer, (UINT8*)FileBuffer + File->Position, *BufferSize);\r
     File->Position += *BufferSize;\r
 \r
+    FreePool (FileBuffer);\r
+\r
     return EFI_SUCCESS;\r
   }\r
 }\r
@@ -780,7 +822,9 @@ FvSimpleFileSystemSetPosition (
     //\r
     // Reset directory position to first entry\r
     //\r
-    File->DirReadNext = FVFS_GET_FIRST_FILE_INFO (Instance);\r
+    if (File->DirReadNext) {\r
+      File->DirReadNext = FVFS_GET_FIRST_FILE_INFO (Instance);\r
+    }\r
   } else if (Position == 0xFFFFFFFFFFFFFFFFull) {\r
     File->Position = File->FvFileInfo->FileInfo.FileSize;\r
   } else {\r
@@ -895,7 +939,11 @@ FvSimpleFileSystemGetInfo (
     FsInfoOut = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
 \r
     CopyMem (FsInfoOut, &mFsInfoTemplate, sizeof (EFI_FILE_SYSTEM_INFO));\r
-    Status = StrnCpyS (FsInfoOut->VolumeLabel, (*BufferSize - OFFSET_OF (EFI_FILE_SYSTEM_INFO, VolumeLabel)) / sizeof (CHAR16), Instance->VolumeLabel, StrLen (Instance->VolumeLabel));\r
+    Status = StrnCpyS ( FsInfoOut->VolumeLabel,\r
+                        (*BufferSize - OFFSET_OF (EFI_FILE_SYSTEM_INFO, VolumeLabel)) / sizeof (CHAR16),\r
+                        Instance->VolumeLabel,\r
+                        StrLen (Instance->VolumeLabel)\r
+                        );\r
     ASSERT_EFI_ERROR (Status);\r
     FsInfoOut->Size = Size;\r
     return Status;\r
@@ -916,7 +964,11 @@ FvSimpleFileSystemGetInfo (
     }\r
 \r
     FsVolumeLabel = (EFI_FILE_SYSTEM_VOLUME_LABEL*) Buffer;\r
-    Status        = StrnCpyS (FsVolumeLabel->VolumeLabel, (*BufferSize - OFFSET_OF (EFI_FILE_SYSTEM_VOLUME_LABEL, VolumeLabel)) / sizeof (CHAR16), Instance->VolumeLabel, StrLen (Instance->VolumeLabel));\r
+    Status        = StrnCpyS (FsVolumeLabel->VolumeLabel,\r
+                              (*BufferSize - OFFSET_OF (EFI_FILE_SYSTEM_VOLUME_LABEL, VolumeLabel)) / sizeof (CHAR16),\r
+                              Instance->VolumeLabel,\r
+                              StrLen (Instance->VolumeLabel)\r
+                              );\r
     ASSERT_EFI_ERROR (Status);\r
     return Status;\r
   } else {\r
@@ -967,7 +1019,7 @@ FvSimpleFileSystemSetInfo (
   IN VOID                     *Buffer\r
   )\r
 {\r
-  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid) || \r
+  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid) ||\r
       CompareGuid (InformationType, &gEfiFileInfoGuid) ||\r
       CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     return EFI_WRITE_PROTECTED;\r