|
From: | Baksik, Fred [USA] |
Subject: | grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB |
Date: | Wed, 24 May 2023 13:13:57 +0000 |
GRUB2 fails to load a Multiboot2 ELF with loadable regions above 4GiB. The error seen is “segment crosses 4 GiB border”. The 4 GiB border check was added as part of “multiboot2: Add support for relocatable images” commit a620876e3b32e4ea0c9a7b3541fcb9a4dd4fb9eb. I believe this check should only apply when the multiboot2 image supports relocation via the MULTIBOOT_HEADER_TAG_RELOCATABLE tag. Subject: [PATCH] multiboot2: check 4GiB limit for relocatable images only --- grub-core/loader/multiboot_elfxx.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/grub-core/loader/multiboot_elfxx.c b/grub-core/loader/multiboot_elfxx.c index f2318e0..0ac11f0 100644 --- a/grub-core/loader/multiboot_elfxx.c +++ b/grub-core/loader/multiboot_elfxx.c @@ -92,10 +92,6 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) highest_load = grub_max (highest_load, phdr(i)->p_paddr + phdr(i)->p_memsz); } -#ifdef MULTIBOOT_LOAD_ELF64 - if (highest_load >= 0x100000000) - return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border"); -#endif if (mld->relocatable) { @@ -106,6 +102,11 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) (long) mld->align, mld->preference, load_size, mld->avoid_efi_boot_services); +#ifdef MULTIBOOT_LOAD_ELF64 + if (highest_load >= 0x100000000) + return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border"); +#endif + if (load_size > mld->max_addr || mld->min_addr > mld->max_addr - load_size) return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load size"); -- 2.31.1 Fred Baksik Mercury Systems |
[Prev in Thread] | Current Thread | [Next in Thread] |