| From 0a701692268b6072ed124431a55471f47f5f805b Mon Sep 17 00:00:00 2001 |
| From: Sami Tolvanen <samitolvanen@google.com> |
| Date: Tue, 8 Oct 2019 15:40:49 -0700 |
| Subject: [PATCH] syscalls/x86: Fix function types in COND_SYSCALL |
| |
| commit 6e4847640c6aebcaa2d9b3686cecc91b41f09269 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h |
| index 3dab04841494..e2389ce9bf58 100644 |
| --- a/arch/x86/include/asm/syscall_wrapper.h |
| +++ b/arch/x86/include/asm/syscall_wrapper.h |
| @@ -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 \ |
| @@ -64,9 +66,15 @@ |
| 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); \ |
| @@ -218,7 +226,11 @@ |
| #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 |
| @@ -230,7 +242,6 @@ |
| * 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); |
| -- |
| 2.7.4 |
| |