]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
syscalls/x86: Use COMPAT_SYSCALL_DEFINE0 for IA32 (rt_)sigreturn
authorSami Tolvanen <samitolvanen@google.com>
Tue, 8 Oct 2019 22:40:47 +0000 (15:40 -0700)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 14 Feb 2020 06:00:53 +0000 (01:00 -0500)
BugLink: https://bugs.launchpad.net/bugs/1862227
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/ia32/ia32_signal.c

index c00019abd0769d60d7a142db83b611d076e9ab0b..07bdf0c0b2312343785ed9bc3cce055d2aa30460 100644 (file)
 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
 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
index 1cee10091b9fb098e5f09478465168bd4ff2393d..30416d7f19d4f8b94248e9e4e149fb21b5e26f8b 100644 (file)
@@ -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;