From: Lennart Poettering Date: Tue, 23 Feb 2021 13:16:08 +0000 (+0100) Subject: efi stub: accept it if our loaded image has no FilePath field set X-Git-Tag: v248-rc2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=685097b9cadf92d21dfa857c3a7ddc1ba115088e;p=thirdparty%2Fsystemd.git efi stub: accept it if our loaded image has no FilePath field set The firmware spec doesn't really say whether FilePath of the LoadedImage protocol may be NULL or not. So far we assumed it to be non-NULL, but apparently the FreeBSD UEFI chainloader sets it to NULL. Handle this gracefully. (Noticed and tracked down by Alexander Schreiber) Fixes: #18733 --- diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c index f0f302ce8c0..1d9a5f07ab1 100644 --- a/src/boot/efi/stub.c +++ b/src/boot/efi/stub.c @@ -84,8 +84,14 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS) efivar_set(LOADER_GUID, L"LoaderDevicePartUUID", uuid, 0); - /* if LoaderImageIdentifier is not set, assume the image with this stub was loaded directly from UEFI */ - if (efivar_get_raw(LOADER_GUID, L"LoaderImageIdentifier", NULL, NULL) != EFI_SUCCESS) { + /* If LoaderImageIdentifier is not set, assume the image with this stub was loaded directly from the + * UEFI firmware without any boot loader, and hence set the LoaderImageIdentifier ourselves. Note + * that some boot chain loaders neither set LoaderImageIdentifier nor make FilePath available to us, + * in which case there's simple nothing to set for us. (The UEFI spec doesn't really say who's wrong + * here, i.e. whether FilePath may be NULL or not, hence handle this gracefully and check if FilePath + * is non-NULL explicitly.) */ + if (efivar_get_raw(LOADER_GUID, L"LoaderImageIdentifier", NULL, NULL) != EFI_SUCCESS && + loaded_image->FilePath) { _cleanup_freepool_ CHAR16 *s; s = DevicePathToStr(loaded_image->FilePath);