Re: [PATCH] sigaltstack: support SS_AUTODISARM for CONFIG_COMPAT

From: Andy Lutomirski
Date: Sat Feb 04 2017 - 12:33:44 EST


On Sat, Feb 4, 2017 at 4:07 AM, Stas Sergeev <stsp@xxxxxxx> wrote:
> Currently SS_AUTODISARM is not supported in compatibility
> mode, but does not return -EINVAL either. This makes dosemu
> built with -m32 on x86_64 to crash. Also the kernel's sigaltstack
> selftest fails if compiled with -m32.
>
> This patch adds the needed support. It also improves the
> selftest output a little (%i changed to %x for bitmasks).
>
> Signed-off-by: Stas Sergeev <stsp@xxxxxxxxxxxxxxxxxxxxx>
>

Spurious newline. Also, should this be cc:stable?

> CC: Shuah Khan <shuahkh@xxxxxxxxxxxxxxx>
> CC: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> CC: Jiri Kosina <jkosina@xxxxxxx>
> CC: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
> CC: Stephen Bates <stephen.bates@xxxxxxxx>
> CC: Milosz Tanski <milosz@xxxxxxxxx>
> CC: Andy Lutomirski <luto@xxxxxxxxxx>
> CC: Ingo Molnar <mingo@xxxxxxxxxx>
> CC: "Peter Zijlstra (Intel)" <peterz@xxxxxxxxxxxxx>
> CC: Helge Deller <deller@xxxxxx>
> CC: Wang Xiaoqiang <wangxq10@xxxxxxxxxx>
> CC: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
> CC: Sasha Levin <sasha.levin@xxxxxxxxxx>
> CC: linux-kernel@xxxxxxxxxxxxxxx
> ---
> include/linux/compat.h | 4 +++-
> kernel/signal.c | 11 +++++++++--
> tools/testing/selftests/sigaltstack/sas.c | 7 ++++---
> 3 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/include/linux/compat.h b/include/linux/compat.h
> index 6360939..d8535a4 100644
> --- a/include/linux/compat.h
> +++ b/include/linux/compat.h
> @@ -711,8 +711,10 @@ int __compat_save_altstack(compat_stack_t __user *, unsigned long);
> 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_flags, &__uss->ss_flags); \

Should the sas_ss_flags() helper be deleted, perhaps? This code seems
a bit odd -- it no longer does the on_sig_stack(sp) check.. (It
matches the non-compat code.)