summaryrefslogtreecommitdiff
path: root/shim.c
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 /shim.c
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.
Diffstat (limited to 'shim.c')
-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
*/