|  | @@ -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
 | 
	
		
			
				|  |  | -
 |