diff options
| author | Julian Andres Klode <julian.klode@canonical.com> | 2021-08-04 10:43:30 +0200 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2021-10-12 10:50:44 -0400 |
| commit | 7cbf1184b612b71e06a3750fe827a94caf726cc7 (patch) | |
| tree | f8e2a1901f883f3ad1a2e06bdc667ceb5cb81cd0 | |
| parent | 885feafdc1d2af477c48d156f0aa4c19b828cf18 (diff) | |
| download | efi-boot-shim-7cbf1184b612b71e06a3750fe827a94caf726cc7.tar.gz efi-boot-shim-7cbf1184b612b71e06a3750fe827a94caf726cc7.zip | |
Extract is_removable_media_path() out of should_use_fallback()
Simple refactoring that extracts the path checking on the given
loaded image. This will be useful to check if we were booted via
removable media path in other places.
| -rw-r--r-- | shim.c | 48 |
1 files changed, 31 insertions, 17 deletions
@@ -690,25 +690,12 @@ verify_buffer (char *data, int datasize, } static int -should_use_fallback(EFI_HANDLE image_handle) +is_removable_media_path(EFI_LOADED_IMAGE *li) { - EFI_LOADED_IMAGE *li; unsigned int pathlen = 0; CHAR16 *bootpath = NULL; - EFI_FILE_IO_INTERFACE *fio = NULL; - EFI_FILE *vh = NULL; - EFI_FILE *fh = NULL; - EFI_STATUS efi_status; int ret = 0; - efi_status = BS->HandleProtocol(image_handle, &EFI_LOADED_IMAGE_GUID, - (void **)&li); - if (EFI_ERROR(efi_status)) { - perror(L"Could not get image for boot" EFI_ARCH L".efi: %r\n", - efi_status); - return 0; - } - bootpath = DevicePathToStr(li->FilePath); /* Check the beginning of the string and the end, to avoid @@ -726,6 +713,36 @@ should_use_fallback(EFI_HANDLE image_handle) if (pathlen < 5 || StrCaseCmp(bootpath + pathlen - 4, L".EFI")) goto error; + ret = 1; + +error: + if (bootpath) + FreePool(bootpath); + + return ret; +} + +static int +should_use_fallback(EFI_HANDLE image_handle) +{ + EFI_LOADED_IMAGE *li; + EFI_FILE_IO_INTERFACE *fio = NULL; + EFI_FILE *vh = NULL; + EFI_FILE *fh = NULL; + EFI_STATUS efi_status; + int ret = 0; + + efi_status = BS->HandleProtocol(image_handle, &EFI_LOADED_IMAGE_GUID, + (void **)&li); + if (EFI_ERROR(efi_status)) { + perror(L"Could not get image for boot" EFI_ARCH L".efi: %r\n", + efi_status); + return 0; + } + + if (!is_removable_media_path(li)) + goto error; + efi_status = BS->HandleProtocol(li->DeviceHandle, &FileSystemProtocol, (void **) &fio); if (EFI_ERROR(efi_status)) { @@ -758,12 +775,9 @@ error: fh->Close(fh); if (vh) vh->Close(vh); - if (bootpath) - FreePool(bootpath); return ret; } - /* * Open the second stage bootloader and read it into a buffer */ |
