|
@@ -1,54 +0,0 @@
|
|
|
-From ab7647c2b04501297c50ce7cdb6f6895b9582d22 Mon Sep 17 00:00:00 2001
|
|
|
-From: Greg Ungerer <gerg@kernel.org>
|
|
|
-Date: Fri, 21 Apr 2023 00:21:38 +1000
|
|
|
-Subject: [PATCH] fs: binfmt_elf_efpic: fix personality for fdpic ELF
|
|
|
-
|
|
|
-The elf-fdpic loader hard sets the process personality to either
|
|
|
-PER_LINUX_FDPIC for true elf-fdpic binaries or to PER_LINUX for
|
|
|
-normal ELF binaries (in this case they would be constant displacement
|
|
|
-compiled with -pie for example). The problem with that is that it
|
|
|
-will lose any other bits that may be in the ELF header personality
|
|
|
-(such as the "bug emulation" bits).
|
|
|
-
|
|
|
-On the ARM architecture the ADDR_LIMIT_32BIT flag is used to signify
|
|
|
-a normal 32bit binary - as opposed to a legacy 26bit address binary.
|
|
|
-This matters since start_thread() will set the ARM CPSR register as
|
|
|
-required based on this flag. If the elf-fdpic loader loses this bit
|
|
|
-the process will be mis-configured and crash out pretty quickly.
|
|
|
-
|
|
|
-Modify elf-fdpic loaders personality setting binaries so that it
|
|
|
-preserves the upper three bytes by using the SET_PERSONALITY macro
|
|
|
-to set it. This macro in the generic case sets PER_LINUX and preserves
|
|
|
-the upper bytes. Architectures can override this for their specific
|
|
|
-use case, and ARM does exactly this.
|
|
|
-
|
|
|
-The problem shows up quite easily runing under qemu, but not necessarily
|
|
|
-on all types of real ARM hardware. If the underlying ARM processor does
|
|
|
-not support the legacy 26-bit addressing mode then everyting will work
|
|
|
-as expected.
|
|
|
-
|
|
|
-Signed-off-by: Greg Ungerer <gerg@kernel.org>
|
|
|
----
|
|
|
- fs/binfmt_elf_fdpic.c | 5 ++---
|
|
|
- 1 file changed, 2 insertions(+), 3 deletions(-)
|
|
|
-
|
|
|
-diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
|
|
|
-index a05eafcacfb2..f29ae1d96fd7 100644
|
|
|
---- a/fs/binfmt_elf_fdpic.c
|
|
|
-+++ b/fs/binfmt_elf_fdpic.c
|
|
|
-@@ -345,10 +345,9 @@
|
|
|
- /* there's now no turning back... the old userspace image is dead,
|
|
|
- * defunct, deceased, etc.
|
|
|
- */
|
|
|
-+ SET_PERSONALITY(exec_params.hdr);
|
|
|
- if (elf_check_fdpic(&exec_params.hdr))
|
|
|
-- set_personality(PER_LINUX_FDPIC);
|
|
|
-- else
|
|
|
-- set_personality(PER_LINUX);
|
|
|
-+ current->personality |= PER_LINUX_FDPIC;
|
|
|
- if (elf_read_implies_exec(&exec_params.hdr, executable_stack))
|
|
|
- current->personality |= READ_IMPLIES_EXEC;
|
|
|
-
|
|
|
---
|
|
|
-2.25.1
|
|
|
-
|