summaryrefslogtreecommitdiff
path: root/target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch')
-rw-r--r--target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch b/target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch
new file mode 100644
index 000000000..c7037f4f8
--- /dev/null
+++ b/target/linux/patches/6.1.49/armnommu-fix-elf-fdpic-personality.patch
@@ -0,0 +1,45 @@
+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 non-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
+("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 has lost this
+bit the process will be mis-configured and crash out pretty quickly.
+
+Modify elf-fdpic loaders personality setting for ELF 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 but and
+preserves the upper bytes. Architectures can override this for their
+specific use case, and ARM does exactly this.
+
+Signed-off-by: Greg Ungerer <gerg@kernel.org>
+---
+ fs/binfmt_elf_fdpic.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+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
+@@ -348,7 +348,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
+ if (elf_check_fdpic(&exec_params.hdr))
+ set_personality(PER_LINUX_FDPIC);
+ else
+- set_personality(PER_LINUX);
++ SET_PERSONALITY(exec_params.hdr);
+ if (elf_read_implies_exec(&exec_params.hdr, executable_stack))
+ current->personality |= READ_IMPLIES_EXEC;
+
+--
+2.25.1
+