aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2011-01-12 03:55:22 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2011-01-12 03:55:24 -0500
commit9046e401e752dba784805a7818f99cc45a39cbff (patch)
tree0f05676ac01a7892b7fddf4e9f3a7e335c1f78d1 /arch
parent7a63fa1a85d75756368d9c86fff5c1b193de991c (diff)
[S390] mmap: consider stack address randomization
Consider stack address randomization when calulating mmap_base for flexible mmap layout . Because of address randomization the stack address can be up to 8MB lower than STACK_TOP. When calculating mmap_base this isn't taken into account, which could lead to the case that the gap between the real stack top and mmap_base is lower than what ulimit specifies for the maximum stack size. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/s390/include/asm/elf.h2
-rw-r--r--arch/s390/mm/mmap.c11
2 files changed, 12 insertions, 1 deletions
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h
index 354d42616c7..9dbd3e7a3bc 100644
--- a/arch/s390/include/asm/elf.h
+++ b/arch/s390/include/asm/elf.h
@@ -206,6 +206,8 @@ do { \
206 current->mm->context.noexec == 0; \ 206 current->mm->context.noexec == 0; \
207}) 207})
208 208
209#define STACK_RND_MASK 0x7ffUL
210
209#define ARCH_DLINFO \ 211#define ARCH_DLINFO \
210do { \ 212do { \
211 if (vdso_enabled) \ 213 if (vdso_enabled) \
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c
index 869efbaed3e..5578740ab9c 100644
--- a/arch/s390/mm/mmap.c
+++ b/arch/s390/mm/mmap.c
@@ -30,6 +30,15 @@
30#include <asm/pgalloc.h> 30#include <asm/pgalloc.h>
31#include <asm/compat.h> 31#include <asm/compat.h>
32 32
33static unsigned long stack_maxrandom_size(void)
34{
35 if (!(current->flags & PF_RANDOMIZE))
36 return 0;
37 if (current->personality & ADDR_NO_RANDOMIZE)
38 return 0;
39 return STACK_RND_MASK << PAGE_SHIFT;
40}
41
33/* 42/*
34 * Top of mmap area (just below the process stack). 43 * Top of mmap area (just below the process stack).
35 * 44 *
@@ -47,7 +56,7 @@ static inline unsigned long mmap_base(void)
47 else if (gap > MAX_GAP) 56 else if (gap > MAX_GAP)
48 gap = MAX_GAP; 57 gap = MAX_GAP;
49 58
50 return STACK_TOP - (gap & PAGE_MASK); 59 return STACK_TOP - stack_maxrandom_size() - (gap & PAGE_MASK);
51} 60}
52 61
53static inline int mmap_is_legacy(void) 62static inline int mmap_is_legacy(void)