| From c984634b75a547822fed562666f5dec20c508bad Mon Sep 17 00:00:00 2001 |
| From: Sami Tolvanen <samitolvanen@google.com> |
| Date: Tue, 8 Oct 2019 15:40:47 -0700 |
| Subject: [PATCH] syscalls/x86: Use COMPAT_SYSCALL_DEFINE0 for IA32 |
| (rt_)sigreturn |
| |
| commit 00198a6eaf66609de5e4de9163bb42c7ca9dd7b7 upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl |
| index 8e82e0270b24..2de84851ce1a 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 629d1ee05599..08ee9e6da915 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.7.4 |
| |