mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 22:54:51 +02:00
SecurityPkg/SecureBootConfigDxe: replace OpenFileByDevicePath() with UefiLib API
Replace the OpenFileByDevicePath() function with EfiOpenFileByDevicePath() from UefiLib, correcting the following issues: - imprecise comments on OpenFileByDevicePath(), - code duplication between this module and other modules, - local variable name "EfiSimpleFileSystemProtocol" starting with "Efi" prefix, - bogus "FileHandle = NULL" assignments, - leaking "Handle1" when the device path type/subtype check or the realignment-motivated AllocateCopyPool() fails in the loop, - stale SHELL_FILE_HANDLE reference in a comment. Cc: Chao Zhang <chao.b.zhang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Roman Bacik <roman.bacik@broadcom.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1008 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Chao Zhang <chao.b.zhang@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
parent
9f5d1f7c31
commit
1bf5007428
@ -114,7 +114,6 @@
|
|||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiHiiConfigAccessProtocolGuid ## PRODUCES
|
gEfiHiiConfigAccessProtocolGuid ## PRODUCES
|
||||||
gEfiDevicePathProtocolGuid ## PRODUCES
|
gEfiDevicePathProtocolGuid ## PRODUCES
|
||||||
gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES
|
|
||||||
gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
|
@ -80,155 +80,6 @@ CleanUpPage (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
This function will open a file or directory referenced by DevicePath.
|
|
||||||
|
|
||||||
This function opens a file with the open mode according to the file path. The
|
|
||||||
Attributes is valid only for EFI_FILE_MODE_CREATE.
|
|
||||||
|
|
||||||
@param[in, out] FilePath On input, the device path to the file.
|
|
||||||
On output, the remaining device path.
|
|
||||||
@param[out] FileHandle Pointer to the file handle.
|
|
||||||
@param[in] OpenMode The mode to open the file with.
|
|
||||||
@param[in] Attributes The file's file attributes.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The information was set.
|
|
||||||
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
|
|
||||||
@retval EFI_UNSUPPORTED Could not open the file path.
|
|
||||||
@retval EFI_NOT_FOUND The specified file could not be found on the
|
|
||||||
device or the file system could not be found on
|
|
||||||
the device.
|
|
||||||
@retval EFI_NO_MEDIA The device has no medium.
|
|
||||||
@retval EFI_MEDIA_CHANGED The device has a different medium in it or the
|
|
||||||
medium is no longer supported.
|
|
||||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
|
||||||
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
|
||||||
@retval EFI_WRITE_PROTECTED The file or medium is write protected.
|
|
||||||
@retval EFI_ACCESS_DENIED The file was opened read only.
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
|
|
||||||
file.
|
|
||||||
@retval EFI_VOLUME_FULL The volume is full.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
OpenFileByDevicePath(
|
|
||||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath,
|
|
||||||
OUT EFI_FILE_HANDLE *FileHandle,
|
|
||||||
IN UINT64 OpenMode,
|
|
||||||
IN UINT64 Attributes
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol;
|
|
||||||
EFI_FILE_PROTOCOL *Handle1;
|
|
||||||
EFI_FILE_PROTOCOL *Handle2;
|
|
||||||
EFI_HANDLE DeviceHandle;
|
|
||||||
CHAR16 *PathName;
|
|
||||||
UINTN PathLength;
|
|
||||||
|
|
||||||
if ((FilePath == NULL || FileHandle == NULL)) {
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = gBS->LocateDevicePath (
|
|
||||||
&gEfiSimpleFileSystemProtocolGuid,
|
|
||||||
FilePath,
|
|
||||||
&DeviceHandle
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = gBS->OpenProtocol(
|
|
||||||
DeviceHandle,
|
|
||||||
&gEfiSimpleFileSystemProtocolGuid,
|
|
||||||
(VOID**)&EfiSimpleFileSystemProtocol,
|
|
||||||
gImageHandle,
|
|
||||||
NULL,
|
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = EfiSimpleFileSystemProtocol->OpenVolume(EfiSimpleFileSystemProtocol, &Handle1);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
FileHandle = NULL;
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// go down directories one node at a time.
|
|
||||||
//
|
|
||||||
while (!IsDevicePathEnd (*FilePath)) {
|
|
||||||
//
|
|
||||||
// For file system access each node should be a file path component
|
|
||||||
//
|
|
||||||
if (DevicePathType (*FilePath) != MEDIA_DEVICE_PATH ||
|
|
||||||
DevicePathSubType (*FilePath) != MEDIA_FILEPATH_DP
|
|
||||||
) {
|
|
||||||
FileHandle = NULL;
|
|
||||||
return (EFI_INVALID_PARAMETER);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Open this file path node
|
|
||||||
//
|
|
||||||
Handle2 = Handle1;
|
|
||||||
Handle1 = NULL;
|
|
||||||
PathLength = DevicePathNodeLength (*FilePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL);
|
|
||||||
PathName = AllocateCopyPool (PathLength, ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName);
|
|
||||||
if (PathName == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Try to test opening an existing file
|
|
||||||
//
|
|
||||||
Status = Handle2->Open (
|
|
||||||
Handle2,
|
|
||||||
&Handle1,
|
|
||||||
PathName,
|
|
||||||
OpenMode &~EFI_FILE_MODE_CREATE,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// see if the error was that it needs to be created
|
|
||||||
//
|
|
||||||
if ((EFI_ERROR (Status)) && (OpenMode != (OpenMode &~EFI_FILE_MODE_CREATE))) {
|
|
||||||
Status = Handle2->Open (
|
|
||||||
Handle2,
|
|
||||||
&Handle1,
|
|
||||||
PathName,
|
|
||||||
OpenMode,
|
|
||||||
Attributes
|
|
||||||
);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Close the last node
|
|
||||||
//
|
|
||||||
Handle2->Close (Handle2);
|
|
||||||
|
|
||||||
FreePool (PathName);
|
|
||||||
|
|
||||||
if (EFI_ERROR(Status)) {
|
|
||||||
return (Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get the next node
|
|
||||||
//
|
|
||||||
*FilePath = NextDevicePathNode (*FilePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// This is a weak spot since if the undefined SHELL_FILE_HANDLE format changes this must change also!
|
|
||||||
//
|
|
||||||
*FileHandle = (VOID*)Handle1;
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
|
Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
|
||||||
The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL
|
The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL
|
||||||
@ -312,7 +163,7 @@ UpdatePage(
|
|||||||
|
|
||||||
gSecureBootPrivateData->FileContext->FileName = FileName;
|
gSecureBootPrivateData->FileContext->FileName = FileName;
|
||||||
|
|
||||||
OpenFileByDevicePath(
|
EfiOpenFileByDevicePath (
|
||||||
&FilePath,
|
&FilePath,
|
||||||
&gSecureBootPrivateData->FileContext->FHandle,
|
&gSecureBootPrivateData->FileContext->FHandle,
|
||||||
EFI_FILE_MODE_READ,
|
EFI_FILE_MODE_READ,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user