parisc: Enable KASLR
authorHelge Deller <deller@gmx.de>
Sat, 15 Oct 2016 22:02:27 +0000 (00:02 +0200)
committerHelge Deller <deller@gmx.de>
Mon, 12 Dec 2016 21:21:21 +0000 (22:21 +0100)
Add missing code for userspace executable address randomization, e.g.
applications compiled with the gcc -pie option.

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/Kconfig
arch/parisc/include/asm/elf.h
arch/parisc/kernel/process.c
arch/parisc/kernel/sys_parisc.c

index a14b865870131a052c995fed98cc9e3ed7a3cd2d..3a71f38cdc0553eeb8c026b2b12d3b412e2f2657 100644 (file)
@@ -7,6 +7,7 @@ config PARISC
        select HAVE_FUNCTION_GRAPH_TRACER
        select HAVE_SYSCALL_TRACEPOINTS
        select ARCH_WANT_FRAME_POINTERS
+       select ARCH_HAS_ELF_RANDOMIZE
        select RTC_CLASS
        select RTC_DRV_GENERIC
        select INIT_ALL_POSSIBLE
index 78c9fd32c5546b6ec91d591e853d89a761383c92..a6b2a421571edfb5f981e1558d75525a23a59404 100644 (file)
@@ -348,9 +348,10 @@ struct pt_regs;    /* forward declaration... */
 
 #define ELF_HWCAP      0
 
-#define STACK_RND_MASK (is_32bit_task() ? \
-                               0x7ff >> (PAGE_SHIFT - 12) : \
-                               0x3ffff >> (PAGE_SHIFT - 12))
+/* Masks for stack and mmap randomization */
+#define BRK_RND_MASK   (is_32bit_task() ? 0x07ffUL : 0x3ffffUL)
+#define MMAP_RND_MASK  (is_32bit_task() ? 0x1fffUL : 0x3ffffUL)
+#define STACK_RND_MASK MMAP_RND_MASK
 
 struct mm_struct;
 extern unsigned long arch_randomize_brk(struct mm_struct *);
index 40639439d8b35c7cec7c60d978ae6aa5b070b22f..ea6603ee8d24981abe93c5bc79477e626e54254a 100644 (file)
@@ -276,11 +276,7 @@ void *dereference_function_descriptor(void *ptr)
 
 static inline unsigned long brk_rnd(void)
 {
-       /* 8MB for 32bit, 1GB for 64bit */
-       if (is_32bit_task())
-               return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
-       else
-               return (get_random_int() & 0x3ffffUL) << PAGE_SHIFT;
+       return (get_random_int() & BRK_RND_MASK) << PAGE_SHIFT;
 }
 
 unsigned long arch_randomize_brk(struct mm_struct *mm)
index 0a393a04e89182cba498fa64774dd32177860eb7..a81e177cac7be0c7d1d0f86f0a871d350fea5fdc 100644 (file)
@@ -225,19 +225,17 @@ static unsigned long mmap_rnd(void)
 {
        unsigned long rnd = 0;
 
-       /*
-       *  8 bits of randomness in 32bit mmaps, 20 address space bits
-       * 28 bits of randomness in 64bit mmaps, 40 address space bits
-       */
-       if (current->flags & PF_RANDOMIZE) {
-               if (is_32bit_task())
-                       rnd = get_random_int() % (1<<8);
-               else
-                       rnd = get_random_int() % (1<<28);
-       }
+       if (current->flags & PF_RANDOMIZE)
+               rnd = get_random_int() & MMAP_RND_MASK;
+
        return rnd << PAGE_SHIFT;
 }
 
+unsigned long arch_mmap_rnd(void)
+{
+       return (get_random_int() & MMAP_RND_MASK) << PAGE_SHIFT;
+}
+
 static unsigned long mmap_legacy_base(void)
 {
        return TASK_UNMAPPED_BASE + mmap_rnd();