diff options
author | Jiri Kosina <jkosina@suse.cz> | 2011-11-02 16:37:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-02 19:06:58 -0400 |
commit | a3defbe5c337dbc6da911f8cc49ae3cc3b49b453 (patch) | |
tree | 0971645887ef2848ad4f7bc86d2204aacb748de9 /fs/binfmt_elf.c | |
parent | b35a35b556f5e6b7993ad0baf20173e75c09ce8c (diff) |
binfmt_elf: fix PIE execution with randomization disabled
The case of address space randomization being disabled in runtime through
randomize_va_space sysctl is not treated properly in load_elf_binary(),
resulting in SIGKILL coming at exec() time for certain PIE-linked binaries
in case the randomization has been disabled at runtime prior to calling
exec().
Handle the randomize_va_space == 0 case the same way as if we were not
supporting .text randomization at all.
Based on original patch by H.J. Lu and Josh Boyer.
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: H.J. Lu <hongjiu.lu@intel.com>
Cc: <stable@kernel.org>
Tested-by: Josh Boyer <jwboyer@redhat.com>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/binfmt_elf.c')
-rw-r--r-- | fs/binfmt_elf.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index dd0fdfc56d38..21ac5ee4b43f 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -795,7 +795,16 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
795 | * might try to exec. This is because the brk will | 795 | * might try to exec. This is because the brk will |
796 | * follow the loader, and is not movable. */ | 796 | * follow the loader, and is not movable. */ |
797 | #if defined(CONFIG_X86) || defined(CONFIG_ARM) | 797 | #if defined(CONFIG_X86) || defined(CONFIG_ARM) |
798 | load_bias = 0; | 798 | /* Memory randomization might have been switched off |
799 | * in runtime via sysctl. | ||
800 | * If that is the case, retain the original non-zero | ||
801 | * load_bias value in order to establish proper | ||
802 | * non-randomized mappings. | ||
803 | */ | ||
804 | if (current->flags & PF_RANDOMIZE) | ||
805 | load_bias = 0; | ||
806 | else | ||
807 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | ||
799 | #else | 808 | #else |
800 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | 809 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); |
801 | #endif | 810 | #endif |