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 <samitolva...@google.com>
---
 arch/x86/include/asm/syscall_wrapper.h | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/syscall_wrapper.h 
b/arch/x86/include/asm/syscall_wrapper.h
index 90eb70df0b18..9a595a544017 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                                               \
@@ -56,9 +58,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);           \
@@ -190,7 +198,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
@@ -202,7 +214,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.23.0.237.gc6a4ce50a0-goog

Reply via email to