diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2011-01-12 03:55:22 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2011-01-12 03:55:24 -0500 |
commit | 9046e401e752dba784805a7818f99cc45a39cbff (patch) | |
tree | 0f05676ac01a7892b7fddf4e9f3a7e335c1f78d1 /arch | |
parent | 7a63fa1a85d75756368d9c86fff5c1b193de991c (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.h | 2 | ||||
-rw-r--r-- | arch/s390/mm/mmap.c | 11 |
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 \ |
210 | do { \ | 212 | do { \ |
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 | ||
33 | static 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 | ||
53 | static inline int mmap_is_legacy(void) | 62 | static inline int mmap_is_legacy(void) |