Explorar o código

[S390] Randomise the brk region

Randomize heap address like other architectures do already.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Heiko Carstens %!s(int64=14) %!d(string=hai) anos
pai
achega
3351918282
Modificáronse 2 ficheiros con 21 adicións e 0 borrados
  1. 3 0
      arch/s390/include/asm/elf.h
  2. 18 0
      arch/s390/kernel/process.c

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

@@ -220,4 +220,7 @@ struct linux_binprm;
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
 int arch_setup_additional_pages(struct linux_binprm *, int);
 int arch_setup_additional_pages(struct linux_binprm *, int);
 
 
+extern unsigned long arch_randomize_brk(struct mm_struct *mm);
+#define arch_randomize_brk arch_randomize_brk
+
 #endif
 #endif

+ 18 - 0
arch/s390/kernel/process.c

@@ -341,3 +341,21 @@ unsigned long arch_align_stack(unsigned long sp)
 		sp -= get_random_int() & ~PAGE_MASK;
 		sp -= get_random_int() & ~PAGE_MASK;
 	return sp & ~0xf;
 	return sp & ~0xf;
 }
 }
+
+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;
+}
+
+unsigned long arch_randomize_brk(struct mm_struct *mm)
+{
+	unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd());
+
+	if (ret < mm->brk)
+		return mm->brk;
+	return ret;
+}