diff options
author | David Daney <ddaney@caviumnetworks.com> | 2010-11-01 17:43:07 -0700 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2010-12-16 18:10:54 +0000 |
commit | 1c0d52b9b5e6ca277c13d6fece9c34ed3159423d (patch) | |
tree | 81ffb96ca45de9cdeff0bae2759c1b220d87f1be /arch/mips | |
parent | 1d210386f6ef9000b1cd723cf453c5eb0377e722 (diff) | |
download | linux-stable-1c0d52b9b5e6ca277c13d6fece9c34ed3159423d.tar.gz linux-stable-1c0d52b9b5e6ca277c13d6fece9c34ed3159423d.tar.bz2 linux-stable-1c0d52b9b5e6ca277c13d6fece9c34ed3159423d.zip |
MIPS: Don't clobber personality high bits.
The high bits of current->personality carry settings that we don't want to
clobber on each exec. Only clobber them if the lower bits that indicate
either PER_LINUX or PER_LINUX32 are invalid.
The clobbering prevents us from using useful bits like ADDR_NO_RANDOMIZE.
Reported-by: Camm Maguire <camm@maguirefamily.org>
Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Cc: Camm Maguire <camm@maguirefamily.org>
Patchwork: https://patchwork.linux-mips.org/patch/1750/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/include/asm/elf.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/mips/include/asm/elf.h b/arch/mips/include/asm/elf.h index fd1d39eb7431..455c0ac7d4ea 100644 --- a/arch/mips/include/asm/elf.h +++ b/arch/mips/include/asm/elf.h @@ -249,7 +249,8 @@ extern struct mips_abi mips_abi_n32; #define SET_PERSONALITY(ex) \ do { \ - set_personality(PER_LINUX); \ + if (personality(current->personality) != PER_LINUX) \ + set_personality(PER_LINUX); \ \ current->thread.abi = &mips_abi; \ } while (0) @@ -296,6 +297,8 @@ do { \ #define SET_PERSONALITY(ex) \ do { \ + unsigned int p; \ + \ clear_thread_flag(TIF_32BIT_REGS); \ clear_thread_flag(TIF_32BIT_ADDR); \ \ @@ -304,7 +307,8 @@ do { \ else \ current->thread.abi = &mips_abi; \ \ - if (current->personality != PER_LINUX32) \ + p = personality(current->personality); \ + if (p != PER_LINUX32 && p != PER_LINUX) \ set_personality(PER_LINUX); \ } while (0) |