浏览代码

[S390] mmap: consider stack address randomization

Consider stack address randomization when calulating mmap_base for
flexible mmap layout . Because of address randomization the stack
address can be up to 8MB lower than STACK_TOP.
When calculating mmap_base this isn't taken into account, which could
lead to the case that the gap between the real stack top and mmap_base
is lower than what ulimit specifies for the maximum stack size.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Heiko Carstens 14 年之前
父节点
当前提交
9046e401e7
共有 2 个文件被更改,包括 12 次插入1 次删除
  1. 2 0
      arch/s390/include/asm/elf.h
  2. 10 1
      arch/s390/mm/mmap.c

+ 2 - 0
arch/s390/include/asm/elf.h

@@ -206,6 +206,8 @@ do {								\
 	current->mm->context.noexec == 0;		\
 })
 
+#define STACK_RND_MASK	0x7ffUL
+
 #define ARCH_DLINFO							    \
 do {									    \
 	if (vdso_enabled)						    \

+ 10 - 1
arch/s390/mm/mmap.c

@@ -30,6 +30,15 @@
 #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).
  *
@@ -47,7 +56,7 @@ static inline unsigned long mmap_base(void)
 	else if (gap > MAX_GAP)
 		gap = MAX_GAP;
 
-	return STACK_TOP - (gap & PAGE_MASK);
+	return STACK_TOP - stack_maxrandom_size() - (gap & PAGE_MASK);
 }
 
 static inline int mmap_is_legacy(void)