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

Commit 18d98a79 authored by Helge Deller's avatar Helge Deller
Browse files

parisc: Enable KASLR



Add missing code for userspace executable address randomization, e.g.
applications compiled with the gcc -pie option.

Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 69973b83
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ config PARISC
	select HAVE_FUNCTION_GRAPH_TRACER
	select HAVE_SYSCALL_TRACEPOINTS
	select ARCH_WANT_FRAME_POINTERS
	select ARCH_HAS_ELF_RANDOMIZE
	select RTC_CLASS
	select RTC_DRV_GENERIC
	select INIT_ALL_POSSIBLE
+4 −3
Original line number Diff line number Diff line
@@ -348,9 +348,10 @@ struct pt_regs; /* forward declaration... */

#define ELF_HWCAP	0

#define STACK_RND_MASK	(is_32bit_task() ? \
				0x7ff >> (PAGE_SHIFT - 12) : \
				0x3ffff >> (PAGE_SHIFT - 12))
/* Masks for stack and mmap randomization */
#define BRK_RND_MASK	(is_32bit_task() ? 0x07ffUL : 0x3ffffUL)
#define MMAP_RND_MASK	(is_32bit_task() ? 0x1fffUL : 0x3ffffUL)
#define STACK_RND_MASK	MMAP_RND_MASK

struct mm_struct;
extern unsigned long arch_randomize_brk(struct mm_struct *);
+1 −5
Original line number Diff line number Diff line
@@ -276,11 +276,7 @@ void *dereference_function_descriptor(void *ptr)

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;
	return (get_random_int() & BRK_RND_MASK) << PAGE_SHIFT;
}

unsigned long arch_randomize_brk(struct mm_struct *mm)
+8 −10
Original line number Diff line number Diff line
@@ -225,19 +225,17 @@ static unsigned long mmap_rnd(void)
{
	unsigned long rnd = 0;

	/*
	*  8 bits of randomness in 32bit mmaps, 20 address space bits
	* 28 bits of randomness in 64bit mmaps, 40 address space bits
	*/
	if (current->flags & PF_RANDOMIZE) {
		if (is_32bit_task())
			rnd = get_random_int() % (1<<8);
		else
			rnd = get_random_int() % (1<<28);
	}
	if (current->flags & PF_RANDOMIZE)
		rnd = get_random_int() & MMAP_RND_MASK;

	return rnd << PAGE_SHIFT;
}

unsigned long arch_mmap_rnd(void)
{
	return (get_random_int() & MMAP_RND_MASK) << PAGE_SHIFT;
}

static unsigned long mmap_legacy_base(void)
{
	return TASK_UNMAPPED_BASE + mmap_rnd();