aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-11-12 18:07:55 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-12 22:09:08 -0500
commit7aba842f08bb9e8485ff40067dc090ada4c7f575 (patch)
treece123c31ecd534df33925b0b9861ead2df75c209 /arch
parent4e99b02131b280b064d30a5926ef1c4763f3097b (diff)
s390/mmap: randomize mmap base for bottom up direction
Implement mmap base randomization for the bottom up direction, so ASLR works for both mmap layouts on s390. See also commit df54d6fa5427 ("x86 get_unmapped_area(): use proper mmap base for bottom-up direction"). Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Radu Caragea <sinaelgl@gmail.com> Cc: Michel Lespinasse <walken@google.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/s390/mm/mmap.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c
index 6bcb045d2bd2..9b436c21195e 100644
--- a/arch/s390/mm/mmap.c
+++ b/arch/s390/mm/mmap.c
@@ -64,6 +64,11 @@ static unsigned long mmap_rnd(void)
64 return (get_random_int() & 0x7ffUL) << PAGE_SHIFT; 64 return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
65} 65}
66 66
67static unsigned long mmap_base_legacy(void)
68{
69 return TASK_UNMAPPED_BASE + mmap_rnd();
70}
71
67static inline unsigned long mmap_base(void) 72static inline unsigned long mmap_base(void)
68{ 73{
69 unsigned long gap = rlimit(RLIMIT_STACK); 74 unsigned long gap = rlimit(RLIMIT_STACK);
@@ -89,7 +94,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
89 * bit is set, or if the expected stack growth is unlimited: 94 * bit is set, or if the expected stack growth is unlimited:
90 */ 95 */
91 if (mmap_is_legacy()) { 96 if (mmap_is_legacy()) {
92 mm->mmap_base = TASK_UNMAPPED_BASE; 97 mm->mmap_base = mmap_base_legacy();
93 mm->get_unmapped_area = arch_get_unmapped_area; 98 mm->get_unmapped_area = arch_get_unmapped_area;
94 } else { 99 } else {
95 mm->mmap_base = mmap_base(); 100 mm->mmap_base = mmap_base();
@@ -164,7 +169,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
164 * bit is set, or if the expected stack growth is unlimited: 169 * bit is set, or if the expected stack growth is unlimited:
165 */ 170 */
166 if (mmap_is_legacy()) { 171 if (mmap_is_legacy()) {
167 mm->mmap_base = TASK_UNMAPPED_BASE; 172 mm->mmap_base = mmap_base_legacy();
168 mm->get_unmapped_area = s390_get_unmapped_area; 173 mm->get_unmapped_area = s390_get_unmapped_area;
169 } else { 174 } else {
170 mm->mmap_base = mmap_base(); 175 mm->mmap_base = mmap_base();