From 8250c7a9cc415de8fb04ca8a9e0a09e2e33e6d27 Mon Sep 17 00:00:00 2001 From: Mate Kukri Date: Fri, 24 May 2024 11:41:04 +0100 Subject: [PATCH] loader-proto: Respect optional DevicePath parameter to load_image() load_image() takes an optional parameter, DevicePath, in addition to the SourceBuffer. Currently in shim_load_image() we don't check to see if it's provided in the case where there's no SourceBuffer, even though it can't work without it. This adds that test and errors in that case, as well as avoiding duplicating it when it's not present. Signed-off-by: Mate Kukri --- loader-proto.c | 55 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/loader-proto.c b/loader-proto.c index f899e594e..53d35701c 100644 --- a/loader-proto.c +++ b/loader-proto.c @@ -165,7 +165,7 @@ try_load_from_lf2(EFI_DEVICE_PATH *dp, buffer_properties_t *bprop) static EFI_STATUS EFIAPI shim_load_image(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, - EFI_DEVICE_PATH *FilePath, VOID *SourceBuffer, + EFI_DEVICE_PATH *DevicePath, VOID *SourceBuffer, UINTN SourceSize, EFI_HANDLE *ImageHandle) { SHIM_LOADED_IMAGE *image; @@ -176,9 +176,12 @@ shim_load_image(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, return EFI_UNSUPPORTED; if (!SourceBuffer || !SourceSize) { - if (try_load_from_sfs(FilePath, &bprop) == EFI_SUCCESS) + if (!DevicePath) /* Both SourceBuffer and DevicePath are NULL */ + return EFI_NOT_FOUND; + + if (try_load_from_sfs(DevicePath, &bprop) == EFI_SUCCESS) ; - else if (try_load_from_lf2(FilePath, &bprop) == EFI_SUCCESS) + else if (try_load_from_lf2(DevicePath, &bprop) == EFI_SUCCESS) ; else /* no buffer given and we cannot load from this device */ @@ -192,16 +195,19 @@ shim_load_image(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, * Even if we are using a buffer, try populating the * device_handle and file_path fields the best we can */ - bprop.dp = FilePath; - efi_status = BS->LocateDevicePath(&gEfiDevicePathProtocolGuid, - &bprop.dp, - &bprop.hnd); - if (efi_status != EFI_SUCCESS) { - /* can't seem to pull apart this DP */ - bprop.dp = FilePath; - bprop.hnd = NULL; - } + bprop.dp = DevicePath; + + if (bprop.dp) { + efi_status = BS->LocateDevicePath(&gEfiDevicePathProtocolGuid, + &bprop.dp, + &bprop.hnd); + if (efi_status != EFI_SUCCESS) { + /* can't seem to pull apart this DP */ + bprop.dp = DevicePath; + bprop.hnd = NULL; + } + } } image = AllocatePool(sizeof(*image)); @@ -216,12 +222,19 @@ shim_load_image(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, image->li.ParentHandle = ParentImageHandle; image->li.SystemTable = systab; image->li.DeviceHandle = bprop.hnd; - image->li.FilePath = DuplicateDevicePath(bprop.dp); - image->loaded_image_device_path = DuplicateDevicePath(FilePath); - if (!image->li.FilePath || - !image->loaded_image_device_path) { - efi_status = EFI_OUT_OF_RESOURCES; - goto free_image; + if (bprop.dp) { + image->li.FilePath = DuplicateDevicePath(bprop.dp); + if (!image->li.FilePath) { + efi_status = EFI_OUT_OF_RESOURCES; + goto free_image; + } + } + if (DevicePath) { + image->loaded_image_device_path = DuplicateDevicePath(DevicePath); + if (!image->loaded_image_device_path) { + efi_status = EFI_OUT_OF_RESOURCES; + goto free_image; + } } in_protocol = 1; @@ -305,8 +318,10 @@ shim_start_image(IN EFI_HANDLE ImageHandle, OUT UINTN *ExitDataSize, NULL); BS->FreePages(image->alloc_address, image->alloc_pages); - BS->FreePool(image->li.FilePath); - BS->FreePool(image->loaded_image_device_path); + if (image->li.FilePath) + BS->FreePool(image->li.FilePath); + if (image->loaded_image_device_path) + BS->FreePool(image->loaded_image_device_path); FreePool(image); return efi_status;