The following commit has been merged into the x86/entry branch of tip:

Commit-ID:     00198a6eaf66609de5e4de9163bb42c7ca9dd7b7
Gitweb:        
https://git.kernel.org/tip/00198a6eaf66609de5e4de9163bb42c7ca9dd7b7
Author:        Sami Tolvanen <[email protected]>
AuthorDate:    Tue, 08 Oct 2019 15:40:47 -07:00
Committer:     Ingo Molnar <[email protected]>
CommitterDate: Fri, 11 Oct 2019 12:49:18 +02:00

syscalls/x86: Use COMPAT_SYSCALL_DEFINE0 for IA32 (rt_)sigreturn

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 <[email protected]>
Acked-by: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: H . Peter Anvin <[email protected]>
Cc: Kees Cook <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
 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 3fe0254..2de75fd 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_compat_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 1cee100..30416d7 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 @@ badframe:
        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;

Reply via email to