Am 13. November 2025 12:55:49 MEZ schrieb Marek Vasut 
<[email protected]>:
>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 <[email protected]>

LGTM

Reviewed-by: Heinrich Schuchardt <[email protected]>

>---
>Cc: Heinrich Schuchardt <[email protected]>
>Cc: Ilias Apalodimas <[email protected]>
>Cc: Jonathan Humphreys <[email protected]>
>Cc: Mattijs Korpershoek <[email protected]>
>Cc: Tom Rini <[email protected]>
>Cc: Wadim Egorov <[email protected]>
>Cc: [email protected]
>---
> 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");

Reply via email to