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

Commit 225237bf authored by Kees Cook's avatar Kees Cook Committed by Alex Shi
Browse files

powerpc/uaccess: Enable hardened usercopy



Enables CONFIG_HARDENED_USERCOPY checks on powerpc.

Based on code from PaX and grsecurity.

Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Tested-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
(cherry picked from commit 1d3c1324746fed0e34a5b94d3ed303e7521ed603)
Signed-off-by: default avatarAlex Shi <alex.shi@linaro.org>
parent 434bef23
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@ config PPC
	select EDAC_ATOMIC_SCRUB
	select ARCH_HAS_DMA_SET_COHERENT_MASK
	select HAVE_ARCH_SECCOMP_FILTER
	select HAVE_ARCH_HARDENED_USERCOPY

config GENERIC_CSUM
	def_bool CPU_LITTLE_ENDIAN
+19 −2
Original line number Diff line number Diff line
@@ -325,10 +325,15 @@ static inline unsigned long copy_from_user(void *to,
{
	unsigned long over;

	if (access_ok(VERIFY_READ, from, n))
	if (access_ok(VERIFY_READ, from, n)) {
		if (!__builtin_constant_p(n))
			check_object_size(to, n, false);
		return __copy_tofrom_user((__force void __user *)to, from, n);
	}
	if ((unsigned long)from < TASK_SIZE) {
		over = (unsigned long)from + n - TASK_SIZE;
		if (!__builtin_constant_p(n - over))
			check_object_size(to, n - over, false);
		return __copy_tofrom_user((__force void __user *)to, from,
				n - over) + over;
	}
@@ -340,10 +345,15 @@ static inline unsigned long copy_to_user(void __user *to,
{
	unsigned long over;

	if (access_ok(VERIFY_WRITE, to, n))
	if (access_ok(VERIFY_WRITE, to, n)) {
		if (!__builtin_constant_p(n))
			check_object_size(from, n, true);
		return __copy_tofrom_user(to, (__force void __user *)from, n);
	}
	if ((unsigned long)to < TASK_SIZE) {
		over = (unsigned long)to + n - TASK_SIZE;
		if (!__builtin_constant_p(n))
			check_object_size(from, n - over, true);
		return __copy_tofrom_user(to, (__force void __user *)from,
				n - over) + over;
	}
@@ -387,6 +397,10 @@ static inline unsigned long __copy_from_user_inatomic(void *to,
		if (ret == 0)
			return 0;
	}

	if (!__builtin_constant_p(n))
		check_object_size(to, n, false);

	return __copy_tofrom_user((__force void __user *)to, from, n);
}

@@ -413,6 +427,9 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to,
		if (ret == 0)
			return 0;
	}
	if (!__builtin_constant_p(n))
		check_object_size(from, n, true);

	return __copy_tofrom_user(to, (__force const void __user *)from, n);
}