Re: [PATCH] efi_loader: Assure fitImage from capsule is used from 8-byte aligned address

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Nov 13 13:38:23 CET 2025


Am 13. November 2025 12:55:49 MEZ schrieb Marek Vasut <marek.vasut+renesas at mailbox.org>:
>The fitImage may be stored in EFI update capsule at address that
>is not aligned to 8 bytes. Since fitImage is a DT, new version of
>libfdt 1.7.2 rejects such an unaligned DT. Patch the code and copy
>the fitImage into aligned buffer in case it is not aligned. This
>does increase overhead for unaligned fitImages in EFI capsules, but
>tries to keep the overhead low for aligned ones.
>
>Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>

LGTM

Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

>---
>Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
>Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
>Cc: Jonathan Humphreys <j-humphreys at ti.com>
>Cc: Mattijs Korpershoek <mkorpershoek at kernel.org>
>Cc: Tom Rini <trini at konsulko.com>
>Cc: Wadim Egorov <w.egorov at phytec.de>
>Cc: u-boot at lists.denx.de
>---
> lib/efi_loader/efi_firmware.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
>diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
>index 216df83de67..953a310190b 100644
>--- a/lib/efi_loader/efi_firmware.c
>+++ b/lib/efi_loader/efi_firmware.c
>@@ -651,6 +651,7 @@ efi_status_t EFIAPI efi_firmware_fit_set_image(
> 	efi_status_t status;
> 	struct fmp_state state = { 0 };
> 	char *orig_dfu_env;
>+	void *img;
> 
> 	EFI_ENTRY("%p %d %p %zu %p %p %p\n", this, image_index, image,
> 		  image_size, vendor_code, progress, abort_reason);
>@@ -677,7 +678,20 @@ efi_status_t EFIAPI efi_firmware_fit_set_image(
> 		return EFI_EXIT(EFI_DEVICE_ERROR);
> 	}
> 
>-	ret = fit_update(image);
>+	/* Make sure the update fitImage is properly aligned to 8-bytes */
>+	if ((uintptr_t)image & 7) {
>+		img = memalign(8, image_size);
>+		if (!img)
>+			return EFI_EXIT(EFI_BAD_BUFFER_SIZE);
>+		memcpy(img, image, image_size);
>+	} else {
>+		img = (void *)image;
>+	}
>+
>+	ret = fit_update(img);
>+
>+	if ((uintptr_t)image & 7)
>+		free(img);
> 
> 	if (env_set("dfu_alt_info", orig_dfu_env))
> 		log_warning("Unable to restore env variable \"dfu_alt_info\".  Further DFU operations may fail!\n");



More information about the U-Boot mailing list