]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
modules: Don't allocate space for non-allocable sections
authorPeter Jones <pjones@redhat.com>
Wed, 9 Oct 2024 08:16:38 +0000 (09:16 +0100)
committerDaniel Kiper <daniel.kiper@oracle.com>
Thu, 10 Oct 2024 11:23:19 +0000 (13:23 +0200)
Currently when loading GRUB modules we allocate space for all sections
including those without SHF_ALLOC set. We then copy the sections that
/do/ have SHF_ALLOC set into the allocated memory leaving some of our
allocation untouched forever. Additionally, on platforms with GOT fixups
and trampolines we currently compute alignment round-ups for the
sections and sections with sh_size = 0. This patch removes the extra
space from the allocation computation and makes the allocation
computation loop skip empty sections as the loading loop does.

Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Jan Setje-Eilers <jan.setjeeilers@oracle.com>
Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-By: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/kern/dl.c

index 0bf40caa61a05dea658b2ac6f7a493243bb20efd..37db9fab09c936cf84c9be07ebeb350377b71e04 100644 (file)
@@ -237,6 +237,9 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
        i < e->e_shnum;
        i++, s = (const Elf_Shdr *)((const char *) s + e->e_shentsize))
     {
+      if (s->sh_size == 0 || !(s->sh_flags & SHF_ALLOC))
+       continue;
+
       tsize = ALIGN_UP (tsize, s->sh_addralign) + s->sh_size;
       if (talign < s->sh_addralign)
        talign = s->sh_addralign;