Patch "ARM: 8657/1: uaccess: consistently check object sizes" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ARM: 8657/1: uaccess: consistently check object sizes
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
arm-8657-1-uaccess-consistently-check-object-sizes.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Dec 12 13:26:17 CET 2017
From: Kees Cook <[email protected]>
Date: Thu, 16 Feb 2017 01:43:58 +0100
Subject: ARM: 8657/1: uaccess: consistently check object sizes
From: Kees Cook <[email protected]>
[ Upstream commit 32b143637e8180f5d5cea54320c769210dea4f19 ]
In commit 76624175dcae ("arm64: uaccess: consistently check object sizes"), the object size checks are moved outside the access_ok() so that bad destinations are detected before hitting the "memset(dest, 0, size)" in the copy_from_user() failure path.
This makes the same change for arm, with attention given to possibly extracting the uaccess routines into a common header file for all architectures in the future.
--- arch/arm/include/asm/uaccess.h | 44 +++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-)
arch/arm/include/asm/uaccess.h +32 -12
@@ -478,11 +478,10 @@ extern unsigned long __must_check arm_copy_from_user(void *to, const void __user *from, unsigned long n);static inline unsigned long __must_check -__copy_from_user (void *to,const void __user *from,unsigned long n) +__arch_copy_from_user (void *to,const void __user *from,unsigned long n) {unsigned int __ua_flags; -check_object_size (to, n, false); __ua_flags =uaccess_save_and_enable (); n =arm_copy_from_user (to, from, n);uaccess_restore (__ua_flags);
@@ -495,18 +494,15 @@ extern unsigned long __must_check __copy_to_user_std(void __user *to, const void *from, unsigned long n);static inline unsigned long __must_check -__copy_to_user (void __user *to,const void *from,unsigned long n) +__arch_copy_to_user (void __user *to,const void *from,unsigned long n) {#ifndef CONFIG_UACCESS_WITH_MEMCPY unsigned int __ua_flags; - -check_object_size (from, n, true); __ua_flags =uaccess_save_and_enable (); n =arm_copy_to_user (to, from, n);uaccess_restore (__ua_flags);return n;#else -check_object_size (from, n, true);return arm_copy_to_user (to, from, n);#endif }
@@ -526,25 +522,49 @@ __clear_user(void __user *addr, unsigned }#else -#define __copy_from_user (to, from, n) (memcpy(to, (void __force *)from, n), 0) -#define __copy_to_user (to, from, n) (memcpy((void __force *)to, from, n), 0) +#define __arch_copy_from_user (to, from, n) \ + (memcpy(to, (void __force *)from, n), 0) +#define __arch_copy_to_user (to, from, n) \ + (memcpy((void __force *)to, from, n), 0)#define __clear_user (addr, n) (memset((void __force *)addr, 0, n), 0)#endif -static inline unsigned long __must_check copy_from_user (void *to,const void __user *from,unsigned long n) +static inline unsigned long __must_check +__copy_from_user (void *to,const void __user *from,unsigned long n) +{ +check_object_size (to, n, false); +return __arch_copy_from_user (to, from, n); +} + +static inline unsigned long __must_check +copy_from_user (void *to,const void __user *from,unsigned long n) {unsigned long res = n; + +check_object_size (to, n, false); +if (likely (access_ok (VERIFY_READ , from, n))) - res =__copy_from_user (to, from, n); + res =__arch_copy_from_user (to, from, n);if (unlikely (res))memset (to + (n - res),0 , res);return res; } -static inline unsigned long __must_check copy_to_user (void __user *to,const void *from,unsigned long n) +static inline unsigned long __must_check +__copy_to_user (void __user *to,const void *from,unsigned long n) { +check_object_size (from, n, true); + +return __arch_copy_to_user (to, from, n); +} + +static inline unsigned long __must_check +copy_to_user (void __user *to,const void *from,unsigned long n) +{ +check_object_size (from, n, true); +if (access_ok (VERIFY_WRITE , to, n)) - n =__copy_to_user (to, from, n); + n =__arch_copy_to_user (to, from, n);return n; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/arm-8657-1-uaccess-consistently-check-object-sizes.patch