|
|
e6b8f35 |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
e6b8f35 |
From: Laszlo Ersek <lersek@redhat.com>
|
|
|
e6b8f35 |
Date: Fri, 7 Apr 2023 16:56:09 +0200
|
|
|
e6b8f35 |
Subject: [PATCH] grub_dl_load_segments(): page-align the tramp/GOT areas too
|
|
|
e6b8f35 |
|
|
|
e6b8f35 |
The tramp/GOT write-protection in grub_dl_set_mem_attrs() requires that
|
|
|
e6b8f35 |
the tramp/GOT areas of the module image *not* share a page with any other
|
|
|
e6b8f35 |
memory allocations. Page-align the tramp/GOT areas, while satisfying their
|
|
|
e6b8f35 |
intrinsic alignment requirements too.
|
|
|
e6b8f35 |
|
|
|
e6b8f35 |
Fixes: 887f1d8fa976 (modules: load module sections at page-aligned addresses)
|
|
|
e6b8f35 |
Fixes: ad1b904d325b (nx: set page permissions for loaded modules.)
|
|
|
e6b8f35 |
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
e6b8f35 |
---
|
|
|
e6b8f35 |
grub-core/kern/dl.c | 24 ++++++++++++++++--------
|
|
|
e6b8f35 |
1 file changed, 16 insertions(+), 8 deletions(-)
|
|
|
e6b8f35 |
|
|
|
e6b8f35 |
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
|
|
|
e6b8f35 |
index 3b66fa410e..f3cdb9e0ba 100644
|
|
|
e6b8f35 |
--- a/grub-core/kern/dl.c
|
|
|
e6b8f35 |
+++ b/grub-core/kern/dl.c
|
|
|
e6b8f35 |
@@ -280,7 +280,9 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
|
|
e6b8f35 |
grub_size_t tsize = 0, talign = 1, arch_addralign = 1;
|
|
|
e6b8f35 |
#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv)
|
|
|
e6b8f35 |
grub_size_t tramp;
|
|
|
e6b8f35 |
+ grub_size_t tramp_align;
|
|
|
e6b8f35 |
grub_size_t got;
|
|
|
e6b8f35 |
+ grub_size_t got_align;
|
|
|
e6b8f35 |
grub_err_t err;
|
|
|
e6b8f35 |
#endif
|
|
|
e6b8f35 |
char *ptr;
|
|
|
e6b8f35 |
@@ -311,12 +313,18 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
|
|
e6b8f35 |
err = grub_arch_dl_get_tramp_got_size (e, &tramp, &got;;
|
|
|
e6b8f35 |
if (err)
|
|
|
e6b8f35 |
return err;
|
|
|
e6b8f35 |
- tsize += ALIGN_UP (tramp, GRUB_ARCH_DL_TRAMP_ALIGN);
|
|
|
e6b8f35 |
- if (talign < GRUB_ARCH_DL_TRAMP_ALIGN)
|
|
|
e6b8f35 |
- talign = GRUB_ARCH_DL_TRAMP_ALIGN;
|
|
|
e6b8f35 |
- tsize += ALIGN_UP (got, GRUB_ARCH_DL_GOT_ALIGN);
|
|
|
e6b8f35 |
- if (talign < GRUB_ARCH_DL_GOT_ALIGN)
|
|
|
e6b8f35 |
- talign = GRUB_ARCH_DL_GOT_ALIGN;
|
|
|
e6b8f35 |
+ tramp_align = GRUB_ARCH_DL_TRAMP_ALIGN;
|
|
|
e6b8f35 |
+ if (tramp_align < arch_addralign)
|
|
|
e6b8f35 |
+ tramp_align = arch_addralign;
|
|
|
e6b8f35 |
+ tsize += ALIGN_UP (tramp, tramp_align);
|
|
|
e6b8f35 |
+ if (talign < tramp_align)
|
|
|
e6b8f35 |
+ talign = tramp_align;
|
|
|
e6b8f35 |
+ got_align = GRUB_ARCH_DL_GOT_ALIGN;
|
|
|
e6b8f35 |
+ if (got_align < arch_addralign)
|
|
|
e6b8f35 |
+ got_align = arch_addralign;
|
|
|
e6b8f35 |
+ tsize += ALIGN_UP (got, got_align);
|
|
|
e6b8f35 |
+ if (talign < got_align)
|
|
|
e6b8f35 |
+ talign = got_align;
|
|
|
e6b8f35 |
#endif
|
|
|
e6b8f35 |
|
|
|
e6b8f35 |
#ifdef GRUB_MACHINE_EMU
|
|
|
e6b8f35 |
@@ -376,11 +384,11 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
|
|
e6b8f35 |
}
|
|
|
e6b8f35 |
}
|
|
|
e6b8f35 |
#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv)
|
|
|
e6b8f35 |
- ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN);
|
|
|
e6b8f35 |
+ ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, tramp_align);
|
|
|
e6b8f35 |
mod->tramp = ptr;
|
|
|
e6b8f35 |
mod->trampptr = ptr;
|
|
|
e6b8f35 |
ptr += tramp;
|
|
|
e6b8f35 |
- ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_GOT_ALIGN);
|
|
|
e6b8f35 |
+ ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, got_align);
|
|
|
e6b8f35 |
mod->got = ptr;
|
|
|
e6b8f35 |
mod->gotptr = ptr;
|
|
|
e6b8f35 |
ptr += got;
|