mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
posix-timers: Get rid of [COMPAT_]SYS_NI() uses
Only the posix timer system calls use this (when the posix timer support is disabled, which does not actually happen in any normal case), because they had debug code to print out a warning about missing system calls. Get rid of that special case, and just use the standard COND_SYSCALL interface that creates weak system call stubs that return -ENOSYS for when the system call does not exist. This fixes a kCFI issue with the SYS_NI() hackery: CFI failure at int80_emulation+0x67/0xb0 (target: sys_ni_posix_timers+0x0/0x70; expected type: 0xb02b34d9) WARNING: CPU: 0 PID: 48 at int80_emulation+0x67/0xb0 Reported-by: kernel test robot <oliver.sang@intel.com> Reviewed-by: Sami Tolvanen <samitolvanen@google.com> Tested-by: Sami Tolvanen <samitolvanen@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Borislav Petkov <bp@alien8.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
eee7f5b48e
commit
a4aebe9365
@ -44,9 +44,6 @@
|
|||||||
return sys_ni_syscall(); \
|
return sys_ni_syscall(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COMPAT_SYS_NI(name) \
|
|
||||||
SYSCALL_ALIAS(__arm64_compat_sys_##name, sys_ni_posix_timers);
|
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
#define __SYSCALL_DEFINEx(x, name, ...) \
|
#define __SYSCALL_DEFINEx(x, name, ...) \
|
||||||
@ -81,6 +78,5 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused);
|
asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused);
|
||||||
#define SYS_NI(name) SYSCALL_ALIAS(__arm64_sys_##name, sys_ni_posix_timers);
|
|
||||||
|
|
||||||
#endif /* __ASM_SYSCALL_WRAPPER_H */
|
#endif /* __ASM_SYSCALL_WRAPPER_H */
|
||||||
|
@ -46,9 +46,6 @@ asmlinkage long __riscv_sys_ni_syscall(const struct pt_regs *);
|
|||||||
return sys_ni_syscall(); \
|
return sys_ni_syscall(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COMPAT_SYS_NI(name) \
|
|
||||||
SYSCALL_ALIAS(__riscv_compat_sys_##name, sys_ni_posix_timers);
|
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
#define __SYSCALL_DEFINEx(x, name, ...) \
|
#define __SYSCALL_DEFINEx(x, name, ...) \
|
||||||
@ -82,6 +79,4 @@ asmlinkage long __riscv_sys_ni_syscall(const struct pt_regs *);
|
|||||||
return sys_ni_syscall(); \
|
return sys_ni_syscall(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_NI(name) SYSCALL_ALIAS(__riscv_sys_##name, sys_ni_posix_timers);
|
|
||||||
|
|
||||||
#endif /* __ASM_SYSCALL_WRAPPER_H */
|
#endif /* __ASM_SYSCALL_WRAPPER_H */
|
||||||
|
@ -63,10 +63,6 @@
|
|||||||
cond_syscall(__s390x_sys_##name); \
|
cond_syscall(__s390x_sys_##name); \
|
||||||
cond_syscall(__s390_sys_##name)
|
cond_syscall(__s390_sys_##name)
|
||||||
|
|
||||||
#define SYS_NI(name) \
|
|
||||||
SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers); \
|
|
||||||
SYSCALL_ALIAS(__s390_sys_##name, sys_ni_posix_timers)
|
|
||||||
|
|
||||||
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
||||||
long __s390_compat_sys##name(struct pt_regs *regs); \
|
long __s390_compat_sys##name(struct pt_regs *regs); \
|
||||||
ALLOW_ERROR_INJECTION(__s390_compat_sys##name, ERRNO); \
|
ALLOW_ERROR_INJECTION(__s390_compat_sys##name, ERRNO); \
|
||||||
@ -85,15 +81,11 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* As some compat syscalls may not be implemented, we need to expand
|
* As some compat syscalls may not be implemented, we need to expand
|
||||||
* COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
|
* COND_SYSCALL_COMPAT in kernel/sys_ni.c to cover this case as well.
|
||||||
* kernel/time/posix-stubs.c to cover this case as well.
|
|
||||||
*/
|
*/
|
||||||
#define COND_SYSCALL_COMPAT(name) \
|
#define COND_SYSCALL_COMPAT(name) \
|
||||||
cond_syscall(__s390_compat_sys_##name)
|
cond_syscall(__s390_compat_sys_##name)
|
||||||
|
|
||||||
#define COMPAT_SYS_NI(name) \
|
|
||||||
SYSCALL_ALIAS(__s390_compat_sys_##name, sys_ni_posix_timers)
|
|
||||||
|
|
||||||
#define __S390_SYS_STUBx(x, name, ...) \
|
#define __S390_SYS_STUBx(x, name, ...) \
|
||||||
long __s390_sys##name(struct pt_regs *regs); \
|
long __s390_sys##name(struct pt_regs *regs); \
|
||||||
ALLOW_ERROR_INJECTION(__s390_sys##name, ERRNO); \
|
ALLOW_ERROR_INJECTION(__s390_sys##name, ERRNO); \
|
||||||
@ -124,9 +116,6 @@
|
|||||||
#define COND_SYSCALL(name) \
|
#define COND_SYSCALL(name) \
|
||||||
cond_syscall(__s390x_sys_##name)
|
cond_syscall(__s390x_sys_##name)
|
||||||
|
|
||||||
#define SYS_NI(name) \
|
|
||||||
SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers)
|
|
||||||
|
|
||||||
#define __S390_SYS_STUBx(x, fullname, name, ...)
|
#define __S390_SYS_STUBx(x, fullname, name, ...)
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
@ -86,9 +86,6 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
return sys_ni_syscall(); \
|
return sys_ni_syscall(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __SYS_NI(abi, name) \
|
|
||||||
SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers);
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
#define __X64_SYS_STUB0(name) \
|
#define __X64_SYS_STUB0(name) \
|
||||||
__SYS_STUB0(x64, sys_##name)
|
__SYS_STUB0(x64, sys_##name)
|
||||||
@ -100,13 +97,10 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
#define __X64_COND_SYSCALL(name) \
|
#define __X64_COND_SYSCALL(name) \
|
||||||
__COND_SYSCALL(x64, sys_##name)
|
__COND_SYSCALL(x64, sys_##name)
|
||||||
|
|
||||||
#define __X64_SYS_NI(name) \
|
|
||||||
__SYS_NI(x64, sys_##name)
|
|
||||||
#else /* CONFIG_X86_64 */
|
#else /* CONFIG_X86_64 */
|
||||||
#define __X64_SYS_STUB0(name)
|
#define __X64_SYS_STUB0(name)
|
||||||
#define __X64_SYS_STUBx(x, name, ...)
|
#define __X64_SYS_STUBx(x, name, ...)
|
||||||
#define __X64_COND_SYSCALL(name)
|
#define __X64_COND_SYSCALL(name)
|
||||||
#define __X64_SYS_NI(name)
|
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
|
#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
|
||||||
@ -120,13 +114,10 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
#define __IA32_COND_SYSCALL(name) \
|
#define __IA32_COND_SYSCALL(name) \
|
||||||
__COND_SYSCALL(ia32, sys_##name)
|
__COND_SYSCALL(ia32, sys_##name)
|
||||||
|
|
||||||
#define __IA32_SYS_NI(name) \
|
|
||||||
__SYS_NI(ia32, sys_##name)
|
|
||||||
#else /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */
|
#else /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */
|
||||||
#define __IA32_SYS_STUB0(name)
|
#define __IA32_SYS_STUB0(name)
|
||||||
#define __IA32_SYS_STUBx(x, name, ...)
|
#define __IA32_SYS_STUBx(x, name, ...)
|
||||||
#define __IA32_COND_SYSCALL(name)
|
#define __IA32_COND_SYSCALL(name)
|
||||||
#define __IA32_SYS_NI(name)
|
|
||||||
#endif /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */
|
#endif /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */
|
||||||
|
|
||||||
#ifdef CONFIG_IA32_EMULATION
|
#ifdef CONFIG_IA32_EMULATION
|
||||||
@ -135,8 +126,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
* additional wrappers (aptly named __ia32_sys_xyzzy) which decode the
|
* additional wrappers (aptly named __ia32_sys_xyzzy) which decode the
|
||||||
* ia32 regs in the proper order for shared or "common" syscalls. As some
|
* ia32 regs in the proper order for shared or "common" syscalls. As some
|
||||||
* syscalls may not be implemented, we need to expand COND_SYSCALL in
|
* syscalls may not be implemented, we need to expand COND_SYSCALL in
|
||||||
* kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
|
* kernel/sys_ni.c to cover this case as well.
|
||||||
* case as well.
|
|
||||||
*/
|
*/
|
||||||
#define __IA32_COMPAT_SYS_STUB0(name) \
|
#define __IA32_COMPAT_SYS_STUB0(name) \
|
||||||
__SYS_STUB0(ia32, compat_sys_##name)
|
__SYS_STUB0(ia32, compat_sys_##name)
|
||||||
@ -148,14 +138,10 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
#define __IA32_COMPAT_COND_SYSCALL(name) \
|
#define __IA32_COMPAT_COND_SYSCALL(name) \
|
||||||
__COND_SYSCALL(ia32, compat_sys_##name)
|
__COND_SYSCALL(ia32, compat_sys_##name)
|
||||||
|
|
||||||
#define __IA32_COMPAT_SYS_NI(name) \
|
|
||||||
__SYS_NI(ia32, compat_sys_##name)
|
|
||||||
|
|
||||||
#else /* CONFIG_IA32_EMULATION */
|
#else /* CONFIG_IA32_EMULATION */
|
||||||
#define __IA32_COMPAT_SYS_STUB0(name)
|
#define __IA32_COMPAT_SYS_STUB0(name)
|
||||||
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
|
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
|
||||||
#define __IA32_COMPAT_COND_SYSCALL(name)
|
#define __IA32_COMPAT_COND_SYSCALL(name)
|
||||||
#define __IA32_COMPAT_SYS_NI(name)
|
|
||||||
#endif /* CONFIG_IA32_EMULATION */
|
#endif /* CONFIG_IA32_EMULATION */
|
||||||
|
|
||||||
|
|
||||||
@ -175,13 +161,10 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
#define __X32_COMPAT_COND_SYSCALL(name) \
|
#define __X32_COMPAT_COND_SYSCALL(name) \
|
||||||
__COND_SYSCALL(x64, compat_sys_##name)
|
__COND_SYSCALL(x64, compat_sys_##name)
|
||||||
|
|
||||||
#define __X32_COMPAT_SYS_NI(name) \
|
|
||||||
__SYS_NI(x64, compat_sys_##name)
|
|
||||||
#else /* CONFIG_X86_X32_ABI */
|
#else /* CONFIG_X86_X32_ABI */
|
||||||
#define __X32_COMPAT_SYS_STUB0(name)
|
#define __X32_COMPAT_SYS_STUB0(name)
|
||||||
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
|
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
|
||||||
#define __X32_COMPAT_COND_SYSCALL(name)
|
#define __X32_COMPAT_COND_SYSCALL(name)
|
||||||
#define __X32_COMPAT_SYS_NI(name)
|
|
||||||
#endif /* CONFIG_X86_X32_ABI */
|
#endif /* CONFIG_X86_X32_ABI */
|
||||||
|
|
||||||
|
|
||||||
@ -212,17 +195,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* As some compat syscalls may not be implemented, we need to expand
|
* As some compat syscalls may not be implemented, we need to expand
|
||||||
* COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
|
* COND_SYSCALL_COMPAT in kernel/sys_ni.c to cover this case as well.
|
||||||
* kernel/time/posix-stubs.c to cover this case as well.
|
|
||||||
*/
|
*/
|
||||||
#define COND_SYSCALL_COMPAT(name) \
|
#define COND_SYSCALL_COMPAT(name) \
|
||||||
__IA32_COMPAT_COND_SYSCALL(name) \
|
__IA32_COMPAT_COND_SYSCALL(name) \
|
||||||
__X32_COMPAT_COND_SYSCALL(name)
|
__X32_COMPAT_COND_SYSCALL(name)
|
||||||
|
|
||||||
#define COMPAT_SYS_NI(name) \
|
|
||||||
__IA32_COMPAT_SYS_NI(name) \
|
|
||||||
__X32_COMPAT_SYS_NI(name)
|
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
#define __SYSCALL_DEFINEx(x, name, ...) \
|
#define __SYSCALL_DEFINEx(x, name, ...) \
|
||||||
@ -243,8 +221,8 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
* As the generic SYSCALL_DEFINE0() macro does not decode any parameters for
|
* As the generic SYSCALL_DEFINE0() macro does not decode any parameters for
|
||||||
* obvious reasons, and passing struct pt_regs *regs to it in %rdi does not
|
* obvious reasons, and passing struct pt_regs *regs to it in %rdi does not
|
||||||
* hurt, we only need to re-define it here to keep the naming congruent to
|
* hurt, we only need to re-define it here to keep the naming congruent to
|
||||||
* SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI()
|
* SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() macro
|
||||||
* macros to work correctly.
|
* to work correctly.
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_DEFINE0(sname) \
|
#define SYSCALL_DEFINE0(sname) \
|
||||||
SYSCALL_METADATA(_##sname, 0); \
|
SYSCALL_METADATA(_##sname, 0); \
|
||||||
@ -257,10 +235,6 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||||||
__X64_COND_SYSCALL(name) \
|
__X64_COND_SYSCALL(name) \
|
||||||
__IA32_COND_SYSCALL(name)
|
__IA32_COND_SYSCALL(name)
|
||||||
|
|
||||||
#define SYS_NI(name) \
|
|
||||||
__X64_SYS_NI(name) \
|
|
||||||
__IA32_SYS_NI(name)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For VSYSCALLS, we need to declare these three syscalls with the new
|
* For VSYSCALLS, we need to declare these three syscalls with the new
|
||||||
|
@ -201,6 +201,20 @@ COND_SYSCALL(recvmmsg_time32);
|
|||||||
COND_SYSCALL_COMPAT(recvmmsg_time32);
|
COND_SYSCALL_COMPAT(recvmmsg_time32);
|
||||||
COND_SYSCALL_COMPAT(recvmmsg_time64);
|
COND_SYSCALL_COMPAT(recvmmsg_time64);
|
||||||
|
|
||||||
|
/* Posix timer syscalls may be configured out */
|
||||||
|
COND_SYSCALL(timer_create);
|
||||||
|
COND_SYSCALL(timer_gettime);
|
||||||
|
COND_SYSCALL(timer_getoverrun);
|
||||||
|
COND_SYSCALL(timer_settime);
|
||||||
|
COND_SYSCALL(timer_delete);
|
||||||
|
COND_SYSCALL(clock_adjtime);
|
||||||
|
COND_SYSCALL(getitimer);
|
||||||
|
COND_SYSCALL(setitimer);
|
||||||
|
COND_SYSCALL(alarm);
|
||||||
|
COND_SYSCALL_COMPAT(timer_create);
|
||||||
|
COND_SYSCALL_COMPAT(getitimer);
|
||||||
|
COND_SYSCALL_COMPAT(setitimer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Architecture specific syscalls: see further below
|
* Architecture specific syscalls: see further below
|
||||||
*/
|
*/
|
||||||
|
@ -17,40 +17,6 @@
|
|||||||
#include <linux/time_namespace.h>
|
#include <linux/time_namespace.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
|
|
||||||
/* Architectures may override SYS_NI and COMPAT_SYS_NI */
|
|
||||||
#include <asm/syscall_wrapper.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
asmlinkage long sys_ni_posix_timers(void)
|
|
||||||
{
|
|
||||||
pr_err_once("process %d (%s) attempted a POSIX timer syscall "
|
|
||||||
"while CONFIG_POSIX_TIMERS is not set\n",
|
|
||||||
current->pid, current->comm);
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SYS_NI
|
|
||||||
#define SYS_NI(name) SYSCALL_ALIAS(sys_##name, sys_ni_posix_timers)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef COMPAT_SYS_NI
|
|
||||||
#define COMPAT_SYS_NI(name) SYSCALL_ALIAS(compat_sys_##name, sys_ni_posix_timers)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SYS_NI(timer_create);
|
|
||||||
SYS_NI(timer_gettime);
|
|
||||||
SYS_NI(timer_getoverrun);
|
|
||||||
SYS_NI(timer_settime);
|
|
||||||
SYS_NI(timer_delete);
|
|
||||||
SYS_NI(clock_adjtime);
|
|
||||||
SYS_NI(getitimer);
|
|
||||||
SYS_NI(setitimer);
|
|
||||||
SYS_NI(clock_adjtime32);
|
|
||||||
#ifdef __ARCH_WANT_SYS_ALARM
|
|
||||||
SYS_NI(alarm);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
|
* We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
|
||||||
* as it is easy to remain compatible with little code. CLOCK_BOOTTIME
|
* as it is easy to remain compatible with little code. CLOCK_BOOTTIME
|
||||||
@ -158,18 +124,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
|||||||
which_clock);
|
which_clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
|
||||||
COMPAT_SYS_NI(timer_create);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_COMPAT) || defined(CONFIG_ALPHA)
|
|
||||||
COMPAT_SYS_NI(getitimer);
|
|
||||||
COMPAT_SYS_NI(setitimer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
SYS_NI(timer_settime32);
|
|
||||||
SYS_NI(timer_gettime32);
|
|
||||||
|
|
||||||
SYSCALL_DEFINE2(clock_settime32, const clockid_t, which_clock,
|
SYSCALL_DEFINE2(clock_settime32, const clockid_t, which_clock,
|
||||||
struct old_timespec32 __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
|
Loading…
Reference in New Issue
Block a user