When building for 32 bit architectures, casting from 64 bit EFI_PHYSICAL_ADDRESS to 32 bit VOID * elicits a compiler warning (-Wint-to-pointer-cast).
Check that the cast will not drop high order bits by using uintptr_t as an intermediate type to transform the address quietly. Signed-off-by: Earl Chew <[email protected]> --- kernel-stub/main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/kernel-stub/main.c b/kernel-stub/main.c index c0be1f6..1695eec 100644 --- a/kernel-stub/main.c +++ b/kernel-stub/main.c @@ -104,6 +104,7 @@ EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) BOOLEAN has_dtbs = FALSE; const VOID *kernel_source; EFI_PHYSICAL_ADDRESS kernel_buffer; + EFI_PHYSICAL_ADDRESS aligned_kernel_buffer; const CHAR8 *fdt_compatible; VOID *fdt, *alt_fdt = NULL; EFI_IMAGE_ENTRY_POINT kernel_entry; @@ -193,8 +194,14 @@ EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) goto cleanup_initrd; } - kernel_image.ImageBase = (VOID *) + aligned_kernel_buffer = align_addr(kernel_buffer, pe_header->Opt.SectionAlignment); + if ((uintptr_t) kernel_image.ImageBase != aligned_kernel_buffer) { + error(L"Alignment overflow for kernel image", EFI_LOAD_ERROR); + goto cleanup_buffer; + } + + kernel_image.ImageBase = (VOID *) (uintptr_t) aligned_kernel_buffer; kernel_image.ImageSize = kernel_section->VirtualSize; CopyMem(kernel_image.ImageBase, kernel_source, kernel_image.ImageSize); -- 2.39.1 -- You received this message because you are subscribed to the Google Groups "EFI Boot Guard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/efibootguard-dev/20230810004832.2491377-1-earl_chew%40yahoo.com.
