s390/mmap: randomize mmap base for bottom up direction
authorHeiko Carstens <[email protected]>
Tue, 12 Nov 2013 23:07:55 +0000 (15:07 -0800)
committerLinus Torvalds <[email protected]>
Wed, 13 Nov 2013 03:09:08 +0000 (12:09 +0900)
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 <[email protected]>
Cc: Radu Caragea <[email protected]>
Cc: Michel Lespinasse <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Chris Metcalf <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
arch/s390/mm/mmap.c

index 6bcb045d2bd2f8ab3b1234e13f00be719dc0441e..9b436c21195ec6b16465bb6e1964e2ad343b8321 100644 (file)
@@ -64,6 +64,11 @@ static unsigned long mmap_rnd(void)
        return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
 }
 
+static unsigned long mmap_base_legacy(void)
+{
+       return TASK_UNMAPPED_BASE + mmap_rnd();
+}
+
 static inline unsigned long mmap_base(void)
 {
        unsigned long gap = rlimit(RLIMIT_STACK);
@@ -89,7 +94,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
         * bit is set, or if the expected stack growth is unlimited:
         */
        if (mmap_is_legacy()) {
-               mm->mmap_base = TASK_UNMAPPED_BASE;
+               mm->mmap_base = mmap_base_legacy();
                mm->get_unmapped_area = arch_get_unmapped_area;
        } else {
                mm->mmap_base = mmap_base();
@@ -164,7 +169,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
         * bit is set, or if the expected stack growth is unlimited:
         */
        if (mmap_is_legacy()) {
-               mm->mmap_base = TASK_UNMAPPED_BASE;
+               mm->mmap_base = mmap_base_legacy();
                mm->get_unmapped_area = s390_get_unmapped_area;
        } else {
                mm->mmap_base = mmap_base();