Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f0569df authored by Kees Cook's avatar Kees Cook Committed by Linus Torvalds
Browse files

mips: extract logic for mmap_rnd()



In preparation for splitting out ET_DYN ASLR, extract the mmap ASLR
selection into a separate function.

Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dd04cff1
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -142,19 +142,27 @@ unsigned long arch_get_unmapped_area_topdown(struct file *filp,
			addr0, len, pgoff, flags, DOWN);
}

void arch_pick_mmap_layout(struct mm_struct *mm)
static unsigned long mmap_rnd(void)
{
	unsigned long random_factor = 0UL;
	unsigned long rnd;

	if (current->flags & PF_RANDOMIZE) {
		random_factor = get_random_int();
		random_factor = random_factor << PAGE_SHIFT;
	rnd = (unsigned long)get_random_int();
	rnd <<= PAGE_SHIFT;
	if (TASK_IS_32BIT_ADDR)
			random_factor &= 0xfffffful;
		rnd &= 0xfffffful;
	else
			random_factor &= 0xffffffful;
		rnd &= 0xffffffful;

	return rnd;
}

void arch_pick_mmap_layout(struct mm_struct *mm)
{
	unsigned long random_factor = 0UL;

	if (current->flags & PF_RANDOMIZE)
		random_factor = mmap_rnd();

	if (mmap_is_legacy()) {
		mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
		mm->get_unmapped_area = arch_get_unmapped_area;