syscalls/x86: Fix function types in COND_SYSCALL
authorSami Tolvanen <samitolvanen@google.com>
Tue, 8 Oct 2019 22:40:49 +0000 (15:40 -0700)
committerIngo Molnar <mingo@kernel.org>
Fri, 11 Oct 2019 10:49:19 +0000 (12:49 +0200)
Define a weak function in COND_SYSCALL instead of a weak alias to
sys_ni_syscall(), which has an incompatible type. 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-6-samitolvanen@google.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/syscall_wrapper.h

index 3dab04841494328aa85ed51ac002a373dbab3ed7..e2389ce9bf58af6b326580fac718ba782d44ce6c 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef _ASM_X86_SYSCALL_WRAPPER_H
 #define _ASM_X86_SYSCALL_WRAPPER_H
 
+struct pt_regs;
+
 /* Mapping of registers to parameters for syscalls on x86-64 and x32 */
 #define SC_X86_64_REGS_TO_ARGS(x, ...)                                 \
        __MAP(x,__SC_ARGS                                               \
        SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname);           \
        asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
 
-#define COND_SYSCALL(name)                                             \
-       cond_syscall(__x64_sys_##name);                                 \
-       cond_syscall(__ia32_sys_##name)
+#define COND_SYSCALL(name)                                                     \
+       asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
+       {                                                                       \
+               return sys_ni_syscall();                                        \
+       }                                                                       \
+       asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\
+       {                                                                       \
+               return sys_ni_syscall();                                        \
+       }
 
 #define SYS_NI(name)                                                   \
        SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);           \
 #endif
 
 #ifndef COND_SYSCALL
-#define COND_SYSCALL(name) cond_syscall(__x64_sys_##name)
+#define COND_SYSCALL(name)                                                     \
+       asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
+       {                                                                       \
+               return sys_ni_syscall();                                        \
+       }
 #endif
 
 #ifndef SYS_NI
  * For VSYSCALLS, we need to declare these three syscalls with the new
  * pt_regs-based calling convention for in-kernel use.
  */
-struct pt_regs;
 asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs);
 asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs);
 asmlinkage long __x64_sys_time(const struct pt_regs *regs);