diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-14 08:47:26 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-14 08:47:26 -0800 |
commit | c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4 (patch) | |
tree | 4bf35b974326f1f17de4ea3d17b65aa44811da01 /arch/s390/mm/mmap.c | |
parent | 7f5db6a8022e8d4bb92b3d638068d2c2a9c9b59b (diff) | |
parent | 51120c2cc70fc241721b8016f4eff575e7d6aa30 (diff) | |
download | kernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.zip kernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.tar.gz kernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.tar.bz2 |
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] MAINTAINERS: Update zcrypt driver entry
[S390] Randomize PIEs
[S390] Randomise the brk region
[S390] Add is_32bit_task() helper function
[S390] Randomize lower bits of stack address
[S390] Randomize mmap start address
[S390] Rearrange mmap.c
[S390] Enable flexible mmap layout for 64 bit processes
[S390] vdso: dont map at mmap_base
[S390] reduce miminum gap between stack and mmap_base
[S390] mmap: consider stack address randomization
[S390] Update default configuration
[S390] cio: path_event overindication after resume
Diffstat (limited to 'arch/s390/mm/mmap.c')
-rw-r--r-- | arch/s390/mm/mmap.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index 869efba..c9a9f7f 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -27,17 +27,44 @@ #include <linux/personality.h> #include <linux/mm.h> #include <linux/module.h> +#include <linux/random.h> #include <asm/pgalloc.h> #include <asm/compat.h> +static unsigned long stack_maxrandom_size(void) +{ + if (!(current->flags & PF_RANDOMIZE)) + return 0; + if (current->personality & ADDR_NO_RANDOMIZE) + return 0; + return STACK_RND_MASK << PAGE_SHIFT; +} + /* * Top of mmap area (just below the process stack). * - * Leave an at least ~128 MB hole. + * Leave at least a ~32 MB hole. */ -#define MIN_GAP (128*1024*1024) +#define MIN_GAP (32*1024*1024) #define MAX_GAP (STACK_TOP/6*5) +static inline int mmap_is_legacy(void) +{ + if (current->personality & ADDR_COMPAT_LAYOUT) + return 1; + if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) + return 1; + return sysctl_legacy_va_layout; +} + +static unsigned long mmap_rnd(void) +{ + if (!(current->flags & PF_RANDOMIZE)) + return 0; + /* 8MB randomization for mmap_base */ + return (get_random_int() & 0x7ffUL) << PAGE_SHIFT; +} + static inline unsigned long mmap_base(void) { unsigned long gap = rlimit(RLIMIT_STACK); @@ -46,22 +73,8 @@ static inline unsigned long mmap_base(void) gap = MIN_GAP; else if (gap > MAX_GAP) gap = MAX_GAP; - - return STACK_TOP - (gap & PAGE_MASK); -} - -static inline int mmap_is_legacy(void) -{ -#ifdef CONFIG_64BIT - /* - * Force standard allocation for 64 bit programs. - */ - if (!is_compat_task()) - return 1; -#endif - return sysctl_legacy_va_layout || - (current->personality & ADDR_COMPAT_LAYOUT) || - rlimit(RLIMIT_STACK) == RLIM_INFINITY; + gap &= PAGE_MASK; + return STACK_TOP - stack_maxrandom_size() - mmap_rnd() - gap; } #ifndef CONFIG_64BIT |