x86, smap: Handle csum_partial_copy_*_user()
tip-bot for H. Peter Anvin
merge botCommit-ID: 7263dda41b5a28ae6566fd126d9b06ada73dd721 Gitweb: http://git.kernel.org/tip/7263dda41b5a28ae6566fd126d9b06ada73dd721 Author: H. Peter Anvin <[email protected]> AuthorDate: Fri, 30 Aug 2013 15:43:03 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Sun, 1 Sep 2013 14:09:48 -0700
x86, smap: Handle csum_partial_copy_*_user()
Add SMAP annotations to csum_partial_copy_to/from_user(). These functions legitimately access user space and thus need to set the AC flag.
TODO: add explicit checks that the side with the kernel space pointer really points into kernel space.
Signed-off-by H. Peter Anvin <[email protected]>
Cc <[email protected]> # v3.7+
--- arch/x86/include/asm/checksum_32.h | 22 +++++++++++++++++----- arch/x86/lib/csum-wrappers_64.c | 12 ++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-)
arch/x86/include/asm/checksum_32.h +17 -5
@@ -49,9 +49,15 @@ static inline __wsum csum_partial_copy_from_user(const void __user *src, int len, __wsum sum, int *err_ptr) { + __wsum ret; +might_sleep (); -return csum_partial_copy_generic ((__force void *)src, dst, - len, sum, err_ptr,NULL ); +stac (); + ret =csum_partial_copy_generic ((__force void *)src, dst, + len, sum, err_ptr,NULL ); +clac (); + +return ret; }/*
@@ -176,10 +182,16 @@ static inline __wsum csum_and_copy_to_user(const void *src, int len, __wsum sum, int *err_ptr) { + __wsum ret; +might_sleep (); -if (access_ok (VERIFY_WRITE , dst, len)) -return csum_partial_copy_generic (src, (__force void *)dst, - len, sum,NULL , err_ptr); +if (access_ok (VERIFY_WRITE , dst, len)) { +stac (); + ret =csum_partial_copy_generic (src, (__force void *)dst, + len, sum,NULL , err_ptr); +clac (); +return ret; + }if (len) *err_ptr = -EFAULT ;
arch/x86/lib/csum-wrappers_64.c +10 -2
@@ -6,6 +6,7 @@*/ #include <asm/checksum.h> #include <linux/module.h> +#include <asm/smap.h> /** * csum_partial_copy_from_user - Copy and checksum from user space.
@@ -52,8 +53,10 @@ csum_partial_copy_from_user(const void __user *src, void *dst, len -=2 ; } } +stac (); isum =csum_partial_copy_generic ((__force const void *)src, dst, len, isum, errp,NULL ); +clac ();if (unlikely (*errp)) goto out_err;
@@ -82,6 +85,8 @@ __wsum csum_partial_copy_to_user(const void *src, void __user *dst, int len, __wsum isum, int *errp) { + __wsum ret; +might_sleep ();if (unlikely (!access_ok (VERIFY_WRITE , dst, len))) {
@@ -105,8 +110,11 @@ csum_partial_copy_to_user(const void *src, void __user *dst, } *errp =0 ; -return csum_partial_copy_generic (src, (void __force *)dst, - len, isum,NULL , errp); +stac (); + ret =csum_partial_copy_generic (src, (void __force *)dst, + len, isum,NULL , errp); +clac (); +return ret; }EXPORT_SYMBOL (csum_partial_copy_to_user);