summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2021-08-04 10:43:30 +0200
committerPeter Jones <pjones@redhat.com>2021-10-12 10:50:44 -0400
commit7cbf1184b612b71e06a3750fe827a94caf726cc7 (patch)
treef8e2a1901f883f3ad1a2e06bdc667ceb5cb81cd0
parent885feafdc1d2af477c48d156f0aa4c19b828cf18 (diff)
downloadefi-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.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/shim.c b/shim.c
index 1e95e6df..2bc77b0d 100644
--- a/shim.c
+++ b/shim.c
@@ -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
*/