|
@@ -73,6 +73,7 @@ static long syscall_trace_enter(struct pt_regs *regs)
|
|
|
|
|
|
struct thread_info *ti = pt_regs_to_thread_info(regs);
|
|
|
unsigned long ret = 0;
|
|
|
+ bool emulated = false;
|
|
|
u32 work;
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
|
|
@@ -80,11 +81,19 @@ static long syscall_trace_enter(struct pt_regs *regs)
|
|
|
|
|
|
work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
|
|
|
|
|
|
+ if (unlikely(work & _TIF_SYSCALL_EMU))
|
|
|
+ emulated = true;
|
|
|
+
|
|
|
+ if ((emulated || (work & _TIF_SYSCALL_TRACE)) &&
|
|
|
+ tracehook_report_syscall_entry(regs))
|
|
|
+ return -1L;
|
|
|
+
|
|
|
+ if (emulated)
|
|
|
+ return -1L;
|
|
|
+
|
|
|
#ifdef CONFIG_SECCOMP
|
|
|
/*
|
|
|
- * Do seccomp first -- it should minimize exposure of other
|
|
|
- * code, and keeping seccomp fast is probably more valuable
|
|
|
- * than the rest of this.
|
|
|
+ * Do seccomp after ptrace, to catch any tracer changes.
|
|
|
*/
|
|
|
if (work & _TIF_SECCOMP) {
|
|
|
struct seccomp_data sd;
|
|
@@ -117,13 +126,6 @@ static long syscall_trace_enter(struct pt_regs *regs)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- if (unlikely(work & _TIF_SYSCALL_EMU))
|
|
|
- ret = -1L;
|
|
|
-
|
|
|
- if ((ret || test_thread_flag(TIF_SYSCALL_TRACE)) &&
|
|
|
- tracehook_report_syscall_entry(regs))
|
|
|
- ret = -1L;
|
|
|
-
|
|
|
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
|
|
trace_sys_enter(regs, regs->orig_ax);
|
|
|
|