Commit abfb9498 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Ingo Molnar

x86/entry: Rename is_{ia32,x32}_task() to in_{ia32,x32}_syscall()

The is_ia32_task()/is_x32_task() function names are a big misnomer: they
suggests that the compat-ness of a system call is a task property, which
is not true, the compatness of a system call purely depends on how it
was invoked through the system call layer.

A task may call 32-bit and 64-bit and x32 system calls without changing
any of its kernel visible state.

This specific minomer is also actively dangerous, as it might cause kernel
developers to use the wrong kind of security checks within system calls.

So rename it to in_{ia32,x32}_syscall().
Suggested-by: default avatarAndy Lutomirski <luto@amacapital.net>
Suggested-by: default avatarIngo Molnar <mingo@kernel.org>
Signed-off-by: default avatarDmitry Safonov <dsafonov@virtuozzo.com>
[ Expanded the changelog. ]
Acked-by: default avatarAndy Lutomirski <luto@kernel.org>
Cc: 0x7f454c46@gmail.com
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: akpm@linux-foundation.org
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/1460987025-30360-1-git-send-email-dsafonov@virtuozzo.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 6666ea55
...@@ -191,7 +191,7 @@ long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch, ...@@ -191,7 +191,7 @@ long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch,
long syscall_trace_enter(struct pt_regs *regs) long syscall_trace_enter(struct pt_regs *regs)
{ {
u32 arch = is_ia32_task() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64; u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
unsigned long phase1_result = syscall_trace_enter_phase1(regs, arch); unsigned long phase1_result = syscall_trace_enter_phase1(regs, arch);
if (phase1_result == 0) if (phase1_result == 0)
......
...@@ -307,7 +307,7 @@ static inline void __user *arch_compat_alloc_user_space(long len) ...@@ -307,7 +307,7 @@ static inline void __user *arch_compat_alloc_user_space(long len)
return (void __user *)round_down(sp - len, 16); return (void __user *)round_down(sp - len, 16);
} }
static inline bool is_x32_task(void) static inline bool in_x32_syscall(void)
{ {
#ifdef CONFIG_X86_X32_ABI #ifdef CONFIG_X86_X32_ABI
if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
...@@ -318,7 +318,7 @@ static inline bool is_x32_task(void) ...@@ -318,7 +318,7 @@ static inline bool is_x32_task(void)
static inline bool in_compat_syscall(void) static inline bool in_compat_syscall(void)
{ {
return is_ia32_task() || is_x32_task(); return in_ia32_syscall() || in_x32_syscall();
} }
#define in_compat_syscall in_compat_syscall /* override the generic impl */ #define in_compat_syscall in_compat_syscall /* override the generic impl */
......
...@@ -255,7 +255,7 @@ static inline bool test_and_clear_restore_sigmask(void) ...@@ -255,7 +255,7 @@ static inline bool test_and_clear_restore_sigmask(void)
return true; return true;
} }
static inline bool is_ia32_task(void) static inline bool in_ia32_syscall(void)
{ {
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
return true; return true;
......
...@@ -210,7 +210,7 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long sp, ...@@ -210,7 +210,7 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long sp,
*/ */
if (clone_flags & CLONE_SETTLS) { if (clone_flags & CLONE_SETTLS) {
#ifdef CONFIG_IA32_EMULATION #ifdef CONFIG_IA32_EMULATION
if (is_ia32_task()) if (in_ia32_syscall())
err = do_set_thread_area(p, -1, err = do_set_thread_area(p, -1,
(struct user_desc __user *)tls, 0); (struct user_desc __user *)tls, 0);
else else
......
...@@ -1266,7 +1266,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, ...@@ -1266,7 +1266,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
compat_ulong_t caddr, compat_ulong_t cdata) compat_ulong_t caddr, compat_ulong_t cdata)
{ {
#ifdef CONFIG_X86_X32_ABI #ifdef CONFIG_X86_X32_ABI
if (!is_ia32_task()) if (!in_ia32_syscall())
return x32_arch_ptrace(child, request, caddr, cdata); return x32_arch_ptrace(child, request, caddr, cdata);
#endif #endif
#ifdef CONFIG_IA32_EMULATION #ifdef CONFIG_IA32_EMULATION
......
...@@ -762,7 +762,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs) ...@@ -762,7 +762,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs) static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs)
{ {
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
if (is_ia32_task()) if (in_ia32_syscall())
return __NR_ia32_restart_syscall; return __NR_ia32_restart_syscall;
#endif #endif
#ifdef CONFIG_X86_X32_ABI #ifdef CONFIG_X86_X32_ABI
......
...@@ -516,7 +516,7 @@ struct uprobe_xol_ops { ...@@ -516,7 +516,7 @@ struct uprobe_xol_ops {
static inline int sizeof_long(void) static inline int sizeof_long(void)
{ {
return is_ia32_task() ? 4 : 8; return in_ia32_syscall() ? 4 : 8;
} }
static int default_pre_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs) static int default_pre_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment