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
Sr Prin Software Engineer
Systems | Mission
Mercury Systems
6675 Shiloh Road East, Alpharetta, GA 30005
+1 978.967.3405<tel:+1%20978.967.3405> office

fred.bak...@mrcy.com<mailto:fred.bak...@mrcy.com> | 
mrcy.com<https://www.mrcy.com/>

Reply via email to