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