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
//\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
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
FvProtocol,\r
&FvFileInfo->NameGuid,\r
NULL,\r
- &FvFileInfo->FileInfo.FileSize,\r
+ (UINTN*)&FvFileInfo->FileInfo.FileSize,\r
&FoundType,\r
&Attributes,\r
&AuthenticationStatus\r
FvProtocol,\r
&FvFileInfo->NameGuid,\r
NULL,\r
- &FvFileInfo->FileInfo.FileSize,\r
+ (UINTN*)&FvFileInfo->FileInfo.FileSize,\r
&FoundType,\r
&Attributes,\r
&AuthenticationStatus\r
{\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
\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
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
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
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
//\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
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
\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
//\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
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
}\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
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