MIPS: Add support for ARCH_MMAP_RND_{COMPAT_}BITS
authorMatt Redfearn <matt.redfearn@imgtec.com>
Thu, 24 Nov 2016 17:32:45 +0000 (17:32 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 3 Jan 2017 15:34:43 +0000 (16:34 +0100)
arch_mmap_rnd() uses hard-coded limits of 16MB for the randomisation
of mmap within 32bit processes and 256MB in 64bit processes. Since v4.4
other arches support tuning this value in /proc/sys/vm/mmap_rnd_bits.
Add support for this to MIPS.

Set the minimum(default) number of bits randomisation for 32bit to 8 -
which with 4k pagesize is unchanged from the current 16MB total
randomness. The minimum(default) for 64bit is 12bits, again with 4k
pagesize this is the same as the current 256MB.

This patch is necessary for MIPS32 to pass the Android CTS tests, with
the number of random bits set to 15.

Signed-off-by: Matt Redfearn <matt.redfearn@imgtec.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Daniel Cashman <dcashman@android.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mips@linux-mips.org
Cc: kernel-hardening@lists.openwall.com
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/14617/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/Kconfig
arch/mips/mm/mmap.c

index 9a7730219c93fcdf61a31485a2bba7678978b97e..6ed1a0af33e9fd5d2233361fd1cbbf66d5c50c03 100644 (file)
@@ -14,6 +14,8 @@ config MIPS
        select HAVE_PERF_EVENTS
        select PERF_USE_VMALLOC
        select HAVE_ARCH_KGDB
+       select HAVE_ARCH_MMAP_RND_BITS if MMU
+       select HAVE_ARCH_MMAP_RND_COMPAT_BITS if MMU && COMPAT
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
        select HAVE_CBPF_JIT if !CPU_MICROMIPS
@@ -3073,6 +3075,20 @@ config MMU
        bool
        default y
 
+config ARCH_MMAP_RND_BITS_MIN
+       default 12 if 64BIT
+       default 8
+
+config ARCH_MMAP_RND_BITS_MAX
+       default 18 if 64BIT
+       default 15
+
+config ARCH_MMAP_RND_COMPAT_BITS_MIN
+       default 8
+
+config ARCH_MMAP_RND_COMPAT_BITS_MAX
+       default 15
+
 config I8253
        bool
        select CLKSRC_I8253
index d08ea3ff0f53345e7501dd168f32c2177976f6ee..d6d92c02308dd8790f073cc20d64bd2447ec0ae4 100644 (file)
@@ -146,14 +146,14 @@ unsigned long arch_mmap_rnd(void)
 {
        unsigned long rnd;
 
-       rnd = get_random_long();
-       rnd <<= PAGE_SHIFT;
+#ifdef CONFIG_COMPAT
        if (TASK_IS_32BIT_ADDR)
-               rnd &= 0xfffffful;
+               rnd = get_random_long() & ((1UL << mmap_rnd_compat_bits) - 1);
        else
-               rnd &= 0xffffffful;
+#endif /* CONFIG_COMPAT */
+               rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1);
 
-       return rnd;
+       return rnd << PAGE_SHIFT;
 }
 
 void arch_pick_mmap_layout(struct mm_struct *mm)