diff options
author | Helge Deller <deller@gmx.de> | 2016-10-15 18:02:27 -0400 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2016-12-12 16:21:21 -0500 |
commit | 18d98a79382cbe5a7569788d5b7b18e7015506f2 (patch) | |
tree | bf5d3b90523528747e7a5d67bc9086c288a94ad5 | |
parent | 69973b830859bc6529a7a0468ba0d80ee5117826 (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/Kconfig | 1 | ||||
-rw-r--r-- | arch/parisc/include/asm/elf.h | 7 | ||||
-rw-r--r-- | arch/parisc/kernel/process.c | 6 | ||||
-rw-r--r-- | arch/parisc/kernel/sys_parisc.c | 18 |
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 | ||
355 | struct mm_struct; | 356 | struct mm_struct; |
356 | extern unsigned long arch_randomize_brk(struct mm_struct *); | 357 | extern 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 | ||
277 | static inline unsigned long brk_rnd(void) | 277 | static 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 | ||
286 | unsigned long arch_randomize_brk(struct mm_struct *mm) | 282 | unsigned 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 | ||
234 | unsigned long arch_mmap_rnd(void) | ||
235 | { | ||
236 | return (get_random_int() & MMAP_RND_MASK) << PAGE_SHIFT; | ||
237 | } | ||
238 | |||
241 | static unsigned long mmap_legacy_base(void) | 239 | static unsigned long mmap_legacy_base(void) |
242 | { | 240 | { |
243 | return TASK_UNMAPPED_BASE + mmap_rnd(); | 241 | return TASK_UNMAPPED_BASE + mmap_rnd(); |