Loading arch/s390/include/asm/elf.h +3 −0 Original line number Diff line number Diff line Loading @@ -220,4 +220,7 @@ struct linux_binprm; #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 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 arch/s390/kernel/process.c +18 −0 Original line number Diff line number Diff line Loading @@ -341,3 +341,21 @@ unsigned long arch_align_stack(unsigned long sp) sp -= get_random_int() & ~PAGE_MASK; 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; } Loading
arch/s390/include/asm/elf.h +3 −0 Original line number Diff line number Diff line Loading @@ -220,4 +220,7 @@ struct linux_binprm; #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 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
arch/s390/kernel/process.c +18 −0 Original line number Diff line number Diff line Loading @@ -341,3 +341,21 @@ unsigned long arch_align_stack(unsigned long sp) sp -= get_random_int() & ~PAGE_MASK; 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; }