lkml.org 
[lkml]   [2019]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 051/177] syscalls/x86: Use COMPAT_SYSCALL_DEFINE0 for IA32 (rt_)sigreturn
    Date
    From: Sami Tolvanen <samitolvanen@google.com>

    [ Upstream commit 00198a6eaf66609de5e4de9163bb42c7ca9dd7b7 ]

    Use COMPAT_SYSCALL_DEFINE0 to define (rt_)sigreturn() syscalls to
    replace sys32_sigreturn() and sys32_rt_sigreturn(). This fixes indirect
    call mismatches with Control-Flow Integrity (CFI) checking.

    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Acked-by: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: H . Peter Anvin <hpa@zytor.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20191008224049.115427-4-samitolvanen@google.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/entry/syscalls/syscall_32.tbl | 4 ++--
    arch/x86/ia32/ia32_signal.c | 5 +++--
    2 files changed, 5 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
    index 3cf7b533b3d13..273e99c0b9110 100644
    --- a/arch/x86/entry/syscalls/syscall_32.tbl
    +++ b/arch/x86/entry/syscalls/syscall_32.tbl
    @@ -130,7 +130,7 @@
    116 i386 sysinfo sys_sysinfo __ia32_compat_sys_sysinfo
    117 i386 ipc sys_ipc __ia32_compat_sys_ipc
    118 i386 fsync sys_fsync __ia32_sys_fsync
    -119 i386 sigreturn sys_sigreturn sys32_sigreturn
    +119 i386 sigreturn sys_sigreturn __ia32_compat_sys_sigreturn
    120 i386 clone sys_clone __ia32_compat_sys_x86_clone
    121 i386 setdomainname sys_setdomainname __ia32_sys_setdomainname
    122 i386 uname sys_newuname __ia32_sys_newuname
    @@ -184,7 +184,7 @@
    170 i386 setresgid sys_setresgid16 __ia32_sys_setresgid16
    171 i386 getresgid sys_getresgid16 __ia32_sys_getresgid16
    172 i386 prctl sys_prctl __ia32_sys_prctl
    -173 i386 rt_sigreturn sys_rt_sigreturn sys32_rt_sigreturn
    +173 i386 rt_sigreturn sys_rt_sigreturn __ia32_compat_sys_rt_sigreturn
    174 i386 rt_sigaction sys_rt_sigaction __ia32_compat_sys_rt_sigaction
    175 i386 rt_sigprocmask sys_rt_sigprocmask __ia32_sys_rt_sigprocmask
    176 i386 rt_sigpending sys_rt_sigpending __ia32_compat_sys_rt_sigpending
    diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
    index 513ba49c204fe..35ddf2c9848c6 100644
    --- a/arch/x86/ia32/ia32_signal.c
    +++ b/arch/x86/ia32/ia32_signal.c
    @@ -21,6 +21,7 @@
    #include <linux/personality.h>
    #include <linux/compat.h>
    #include <linux/binfmts.h>
    +#include <linux/syscalls.h>
    #include <asm/ucontext.h>
    #include <linux/uaccess.h>
    #include <asm/fpu/internal.h>
    @@ -118,7 +119,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
    return err;
    }

    -asmlinkage long sys32_sigreturn(void)
    +COMPAT_SYSCALL_DEFINE0(sigreturn)
    {
    struct pt_regs *regs = current_pt_regs();
    struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
    @@ -144,7 +145,7 @@ asmlinkage long sys32_sigreturn(void)
    return 0;
    }

    -asmlinkage long sys32_rt_sigreturn(void)
    +COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
    {
    struct pt_regs *regs = current_pt_regs();
    struct rt_sigframe_ia32 __user *frame;
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-10 22:44    [W:4.108 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site