Add TIF_FD_SLOTS and test it on the untraced return from a system
call in all three entry paths. A task that reserved descriptors calls
syscall_trace_leave(), which commits them before the ptrace exit stop.
The traced paths already end up there.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 arch/m68k/68000/entry.S             | 10 ++++++++++
 arch/m68k/coldfire/entry.S          | 12 ++++++++++++
 arch/m68k/include/asm/thread_info.h |  2 ++
 arch/m68k/kernel/entry.S            |  2 ++
 arch/m68k/kernel/ptrace.c           |  3 +++
 5 files changed, 29 insertions(+)

diff --git a/arch/m68k/68000/entry.S b/arch/m68k/68000/entry.S
index c257cc415c47..479032af2f2f 100644
--- a/arch/m68k/68000/entry.S
+++ b/arch/m68k/68000/entry.S
@@ -89,6 +89,16 @@ ENTRY(system_call)
        jbsr    %a0@
        movel   %d0,%sp@(PT_OFF_D0)     /* save the return value*/
 
+       /* descriptors reserved by the syscall are committed in 
syscall_trace_leave */
+       getthreadinfo
+       btst    #(TIF_FD_SLOTS%8),%a2@(TINFO_FLAGS+(31-TIF_FD_SLOTS)/8)
+       jeq     ret_from_exception
+       subql   #4,%sp                  /* dummy return address */
+       SAVE_SWITCH_STACK
+       jbsr    syscall_trace_leave
+       RESTORE_SWITCH_STACK
+       addql   #4,%sp
+
 ret_from_exception:
        btst    #5,%sp@(PT_OFF_SR)      /* check if returning to kernel*/
        jeq     Luser_return            /* if so, skip resched, signals*/
diff --git a/arch/m68k/coldfire/entry.S b/arch/m68k/coldfire/entry.S
index 4ea08336e2fb..43e47d4c0018 100644
--- a/arch/m68k/coldfire/entry.S
+++ b/arch/m68k/coldfire/entry.S
@@ -78,6 +78,18 @@ ENTRY(system_call)
        movel   %d3,%a0
        jbsr    %a0@
        movel   %d0,%sp@(PT_OFF_D0)     /* save the return value */
+
+       /* descriptors reserved by the syscall are committed in 
syscall_trace_leave */
+       movel   %sp,%d2                 /* get thread_info pointer */
+       andl    #-THREAD_SIZE,%d2       /* at start of kernel stack */
+       movel   %d2,%a0
+       btst    #(TIF_FD_SLOTS%8),%a0@(TINFO_FLAGS+(31-TIF_FD_SLOTS)/8)
+       jeq     ret_from_exception
+       subql   #4,%sp                  /* dummy return address */
+       SAVE_SWITCH_STACK
+       jbsr    syscall_trace_leave
+       RESTORE_SWITCH_STACK
+       addql   #4,%sp
        jra     ret_from_exception
 1:
        movel   #-ENOSYS,%d2            /* strace needs -ENOSYS in PT_OFF_D0 */
diff --git a/arch/m68k/include/asm/thread_info.h 
b/arch/m68k/include/asm/thread_info.h
index 5cb3ace55622..861b6f523bda 100644
--- a/arch/m68k/include/asm/thread_info.h
+++ b/arch/m68k/include/asm/thread_info.h
@@ -62,6 +62,7 @@ static inline struct thread_info *current_thread_info(void)
 #define TIF_NOTIFY_RESUME      5       /* callback before returning to user */
 #define TIF_SIGPENDING         6       /* signal pending */
 #define TIF_NEED_RESCHED       7       /* rescheduling necessary */
+#define TIF_FD_SLOTS           12      /* syscall prepared descriptors */
 #define TIF_SECCOMP            13      /* seccomp syscall filtering active */
 #define TIF_DELAYED_TRACE      14      /* single step a syscall */
 #define TIF_SYSCALL_TRACE      15      /* syscall trace active */
@@ -71,6 +72,7 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_NOTIFY_RESUME     (1 << TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING                (1 << TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1 << TIF_NEED_RESCHED)
+#define _TIF_FD_SLOTS          (1 << TIF_FD_SLOTS)
 #define _TIF_SECCOMP           (1 << TIF_SECCOMP)
 #define _TIF_DELAYED_TRACE     (1 << TIF_DELAYED_TRACE)
 #define _TIF_SYSCALL_TRACE     (1 << TIF_SYSCALL_TRACE)
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
index 338b474910f7..9e4471f68165 100644
--- a/arch/m68k/kernel/entry.S
+++ b/arch/m68k/kernel/entry.S
@@ -229,6 +229,8 @@ ret_from_syscall:
 syscall_exit_work:
        btst    #5,%sp@(PT_OFF_SR)      | check if returning to kernel
        bnes    1b                      | if so, skip resched, signals
+       btst    #4,%a1@(TINFO_FLAGS+2)  | TIF_FD_SLOTS: commit descriptors
+       jne     do_trace_exit
        lslw    #1,%d0
        jcs     do_trace_exit
        jmi     do_delayed_trace
diff --git a/arch/m68k/kernel/ptrace.c b/arch/m68k/kernel/ptrace.c
index 4575f6487a9a..07103e6ddeb0 100644
--- a/arch/m68k/kernel/ptrace.c
+++ b/arch/m68k/kernel/ptrace.c
@@ -11,6 +11,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/file.h>
 #include <linux/sched.h>
 #include <linux/sched/task_stack.h>
 #include <linux/mm.h>
@@ -289,6 +290,8 @@ asmlinkage int syscall_trace_enter(void)
 
 asmlinkage void syscall_trace_leave(void)
 {
+       if (test_thread_flag(TIF_FD_SLOTS))
+               fd_slots_commit(task_pt_regs(current));
        if (test_thread_flag(TIF_SYSCALL_TRACE))
                ptrace_report_syscall_exit(task_pt_regs(current), 0);
 }

-- 
2.53.0

Reply via email to