Patchwork ppc32: Don't clobber personality flags on exec

login
register
mail settings
Submitter Andreas Schwab
Date April 16, 2009, 4:22 p.m.
Message ID <m27i1k8t7a.fsf@igel.home>
Download mbox | patch
Permalink /patch/26073/
State Accepted
Commit 59e4c3a2fe9cb1681bb2cff508ff79466f7585ba
Delegated to: Paul Mackerras
Headers show

Comments

Andreas Schwab - April 16, 2009, 4:22 p.m.
Now that ppc32 implements address randomization it also wants to inherit
personality flags like ADDR_NO_RANDOMIZE across exec, for things like
`setarch ppc -R' to work.  But the ppc32 version of SET_PERSONALITY
forcefully sets PER_LINUX, clearing all personality flags.  So be
careful about preserving the flags.

Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>

---
 arch/powerpc/include/asm/elf.h |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
David Miller - April 16, 2009, 11:17 p.m.
From: Andreas Schwab <schwab@linux-m68k.org>
Date: Thu, 16 Apr 2009 18:22:01 +0200

> Now that ppc32 implements address randomization it also wants to inherit
> personality flags like ADDR_NO_RANDOMIZE across exec, for things like
> `setarch ppc -R' to work.  But the ppc32 version of SET_PERSONALITY
> forcefully sets PER_LINUX, clearing all personality flags.  So be
> careful about preserving the flags.
> 
> Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>

Grumble, sparc has the same bugs...  thanks for finding this.

Patch

Index: linux-2.6.30-rc1/arch/powerpc/include/asm/elf.h
===================================================================
--- linux-2.6.30-rc1.orig/arch/powerpc/include/asm/elf.h	2009-04-08 12:45:56.000000000 +0200
+++ linux-2.6.30-rc1/arch/powerpc/include/asm/elf.h	2009-04-12 14:24:06.000000000 +0200
@@ -258,7 +258,8 @@  do {								\
 # define elf_read_implies_exec(ex, exec_stk) (test_thread_flag(TIF_32BIT) ? \
 		(exec_stk != EXSTACK_DISABLE_X) : 0)
 #else 
-# define SET_PERSONALITY(ex) set_personality(PER_LINUX)
+# define SET_PERSONALITY(ex) \
+  set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
 #endif /* __powerpc64__ */
 
 extern int dcache_bsize;