Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16930251 authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

ANDROID: x86: fix function types in COND_SYSCALL



Define a weak function for COND_SYSCALL instead of creating a weak
alias to a function with an incompatible type. This fixes indirect
call mismatches with Control-Flow Integrity.

Bug: 138254717
Change-Id: I3effbbf5c86107103cf29a40dfb37b268e59bfd8
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
parent 9a8a0e6f
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -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						\
@@ -57,8 +59,14 @@
	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)

#define COND_SYSCALL(name)							\
	cond_syscall(__x64_sys_##name);					\
	cond_syscall(__ia32_sys_##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);