lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Wed, 4 Sep 2013 11:11:09 +1000
From:	Stephen Rothwell <sfr@...b.auug.org.au>
To:	viro@...IV.linux.org.uk
Cc:	linux-kernel@...r.kernel.org, mingo@...nel.org, hpa@...or.com,
	tglx@...utronix.de, hpa@...ux.intel.com
Subject: Re: [tip:x86/smap] Introduce [compat_]save_altstack_ex() to unbreak
 x86 SMAP

On Sun, 1 Sep 2013 14:45:56 -0700 tip-bot for Al Viro <tipbot@...or.com> wrote:
>
> Commit-ID:  bd1c149aa9915b9abb6d83d0f01dfd2ace0680b5
> Gitweb:     http://git.kernel.org/tip/bd1c149aa9915b9abb6d83d0f01dfd2ace0680b5
> Author:     Al Viro <viro@...IV.linux.org.uk>
> AuthorDate: Sun, 1 Sep 2013 20:35:01 +0100
> Committer:  H. Peter Anvin <hpa@...ux.intel.com>
> CommitDate: Sun, 1 Sep 2013 14:16:33 -0700
> 
> Introduce [compat_]save_altstack_ex() to unbreak x86 SMAP
> 
> For performance reasons, when SMAP is in use, SMAP is left open for an
> entire put_user_try { ... } put_user_catch(); block, however, calling
> __put_user() in the middle of that block will close SMAP as the
> STAC..CLAC constructs intentionally do not nest.
> 
> Furthermore, using __put_user() rather than put_user_ex() here is bad
> for performance.
> 
> Thus, introduce new [compat_]save_altstack_ex() helpers that replace
> __[compat_]save_altstack() for x86, being currently the only
> architecture which supports put_user_try { ... } put_user_catch().
> 
> Reported-by: H. Peter Anvin <hpa@...ux.intel.com>
> Signed-off-by: Al Viro <viro@...iv.linux.org.uk>
> Signed-off-by: H. Peter Anvin <hpa@...ux.intel.com>
> Cc: <stable@...r.kernel.org> # v3.8+
> Link: http://lkml.kernel.org/n/tip-es5p6y64if71k8p5u08agv9n@git.kernel.org
> diff --git a/include/linux/compat.h b/include/linux/compat.h
> index 7f0c1dd..ec1aee4 100644
> --- a/include/linux/compat.h
> +++ b/include/linux/compat.h
> @@ -669,6 +669,13 @@ asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
>  
>  int compat_restore_altstack(const compat_stack_t __user *uss);
>  int __compat_save_altstack(compat_stack_t __user *, unsigned long);
> +#define compat_save_altstack_ex(uss, sp) do { \
> +	compat_stack_t __user *__uss = uss; \
> +	struct task_struct *t = current; \
> +	put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \
> +	put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \
> +	put_user_ex(t->sas_ss_size, &__uss->ss_size); \
> +} while (0);

I am just wondering if there is some reason that these macros are not
implemented as (static inline) C functions?

> +#define save_altstack_ex(uss, sp) do { \
> +	stack_t __user *__uss = uss; \
> +	struct task_struct *t = current; \
> +	put_user_ex((void __user *)t->sas_ss_sp, &__uss->ss_sp); \
> +	put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \
> +	put_user_ex(t->sas_ss_size, &__uss->ss_size); \
> +} while (0);
> +
-- 
Cheers,
Stephen Rothwell                    sfr@...b.auug.org.au

Content of type "application/pgp-signature" skipped

Powered by blists - more mailing lists