aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/binfmt_elf.c13
-rw-r--r--include/asm-x86_64/elf.h4
2 files changed, 13 insertions, 4 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 4349113881fb..537893a16014 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -500,17 +500,22 @@ out:
500#define INTERPRETER_AOUT 1 500#define INTERPRETER_AOUT 1
501#define INTERPRETER_ELF 2 501#define INTERPRETER_ELF 2
502 502
503#ifndef STACK_RND_MASK
504#define STACK_RND_MASK 0x7ff /* with 4K pages 8MB of VA */
505#endif
503 506
504static unsigned long randomize_stack_top(unsigned long stack_top) 507static unsigned long randomize_stack_top(unsigned long stack_top)
505{ 508{
506 unsigned int random_variable = 0; 509 unsigned int random_variable = 0;
507 510
508 if (current->flags & PF_RANDOMIZE) 511 if (current->flags & PF_RANDOMIZE) {
509 random_variable = get_random_int() % (8*1024*1024); 512 random_variable = get_random_int() & STACK_RND_MASK;
513 random_variable <<= PAGE_SHIFT;
514 }
510#ifdef CONFIG_STACK_GROWSUP 515#ifdef CONFIG_STACK_GROWSUP
511 return PAGE_ALIGN(stack_top + random_variable); 516 return PAGE_ALIGN(stack_top) + random_variable;
512#else 517#else
513 return PAGE_ALIGN(stack_top - random_variable); 518 return PAGE_ALIGN(stack_top) - random_variable;
514#endif 519#endif
515} 520}
516 521
diff --git a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h
index 43862cd6a569..c98633af07d2 100644
--- a/include/asm-x86_64/elf.h
+++ b/include/asm-x86_64/elf.h
@@ -8,6 +8,7 @@
8#include <asm/ptrace.h> 8#include <asm/ptrace.h>
9#include <asm/user.h> 9#include <asm/user.h>
10#include <asm/processor.h> 10#include <asm/processor.h>
11#include <asm/compat.h>
11 12
12/* x86-64 relocation types */ 13/* x86-64 relocation types */
13#define R_X86_64_NONE 0 /* No reloc */ 14#define R_X86_64_NONE 0 /* No reloc */
@@ -157,6 +158,9 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);
157#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) 158#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
158#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) 159#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)
159 160
161/* 1GB for 64bit, 8MB for 32bit */
162#define STACK_RND_MASK (is_compat_task() ? 0x7ff : 0x3fffff)
163
160#endif 164#endif
161 165
162#endif 166#endif