aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2016-10-15 18:02:27 -0400
committerHelge Deller <deller@gmx.de>2016-12-12 16:21:21 -0500
commit18d98a79382cbe5a7569788d5b7b18e7015506f2 (patch)
treebf5d3b90523528747e7a5d67bc9086c288a94ad5
parent69973b830859bc6529a7a0468ba0d80ee5117826 (diff)
parisc: Enable KASLR
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>
-rw-r--r--arch/parisc/Kconfig1
-rw-r--r--arch/parisc/include/asm/elf.h7
-rw-r--r--arch/parisc/kernel/process.c6
-rw-r--r--arch/parisc/kernel/sys_parisc.c18
4 files changed, 14 insertions, 18 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index a14b86587013..3a71f38cdc05 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -7,6 +7,7 @@ config PARISC
7 select HAVE_FUNCTION_GRAPH_TRACER 7 select HAVE_FUNCTION_GRAPH_TRACER
8 select HAVE_SYSCALL_TRACEPOINTS 8 select HAVE_SYSCALL_TRACEPOINTS
9 select ARCH_WANT_FRAME_POINTERS 9 select ARCH_WANT_FRAME_POINTERS
10 select ARCH_HAS_ELF_RANDOMIZE
10 select RTC_CLASS 11 select RTC_CLASS
11 select RTC_DRV_GENERIC 12 select RTC_DRV_GENERIC
12 select INIT_ALL_POSSIBLE 13 select INIT_ALL_POSSIBLE
diff --git a/arch/parisc/include/asm/elf.h b/arch/parisc/include/asm/elf.h
index 78c9fd32c554..a6b2a421571e 100644
--- a/arch/parisc/include/asm/elf.h
+++ b/arch/parisc/include/asm/elf.h
@@ -348,9 +348,10 @@ struct pt_regs; /* forward declaration... */
348 348
349#define ELF_HWCAP 0 349#define ELF_HWCAP 0
350 350
351#define STACK_RND_MASK (is_32bit_task() ? \ 351/* Masks for stack and mmap randomization */
352 0x7ff >> (PAGE_SHIFT - 12) : \ 352#define BRK_RND_MASK (is_32bit_task() ? 0x07ffUL : 0x3ffffUL)
353 0x3ffff >> (PAGE_SHIFT - 12)) 353#define MMAP_RND_MASK (is_32bit_task() ? 0x1fffUL : 0x3ffffUL)
354#define STACK_RND_MASK MMAP_RND_MASK
354 355
355struct mm_struct; 356struct mm_struct;
356extern unsigned long arch_randomize_brk(struct mm_struct *); 357extern unsigned long arch_randomize_brk(struct mm_struct *);
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
index 40639439d8b3..ea6603ee8d24 100644
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -276,11 +276,7 @@ void *dereference_function_descriptor(void *ptr)
276 276
277static inline unsigned long brk_rnd(void) 277static inline unsigned long brk_rnd(void)
278{ 278{
279 /* 8MB for 32bit, 1GB for 64bit */ 279 return (get_random_int() & BRK_RND_MASK) << PAGE_SHIFT;
280 if (is_32bit_task())
281 return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
282 else
283 return (get_random_int() & 0x3ffffUL) << PAGE_SHIFT;
284} 280}
285 281
286unsigned long arch_randomize_brk(struct mm_struct *mm) 282unsigned long arch_randomize_brk(struct mm_struct *mm)
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c
index 0a393a04e891..a81e177cac7b 100644
--- a/arch/parisc/kernel/sys_parisc.c
+++ b/arch/parisc/kernel/sys_parisc.c
@@ -225,19 +225,17 @@ static unsigned long mmap_rnd(void)
225{ 225{
226 unsigned long rnd = 0; 226 unsigned long rnd = 0;
227 227
228 /* 228 if (current->flags & PF_RANDOMIZE)
229 * 8 bits of randomness in 32bit mmaps, 20 address space bits 229 rnd = get_random_int() & MMAP_RND_MASK;
230 * 28 bits of randomness in 64bit mmaps, 40 address space bits 230
231 */
232 if (current->flags & PF_RANDOMIZE) {
233 if (is_32bit_task())
234 rnd = get_random_int() % (1<<8);
235 else
236 rnd = get_random_int() % (1<<28);
237 }
238 return rnd << PAGE_SHIFT; 231 return rnd << PAGE_SHIFT;
239} 232}
240 233
234unsigned long arch_mmap_rnd(void)
235{
236 return (get_random_int() & MMAP_RND_MASK) << PAGE_SHIFT;
237}
238
241static unsigned long mmap_legacy_base(void) 239static unsigned long mmap_legacy_base(void)
242{ 240{
243 return TASK_UNMAPPED_BASE + mmap_rnd(); 241 return TASK_UNMAPPED_BASE + mmap_rnd();