Commit 69cb2be898be ("powerpc/syscall: Fix syscall skip handling for
seccomp and ptrace") added TIF_SYSCALL_RET, set by
syscall_set_return_value(), so that system_call_exception() skips a
system call whose return value has already been set.

The flag is set with set_thread_flag(), i.e. on current rather than on
the task passed to syscall_set_return_value().  When the caller is a
tracer, as with PTRACE_SET_SYSCALL_INFO and op ==
PTRACE_SYSCALL_INFO_EXIT, the flag ends up on the tracer, and the next
system call of the tracer is silently not executed.  Setting it on the
right task would not be enough either: at a syscall-exit stop the flag
would then skip the next system call of the tracee.

The flag is not needed anymore.  Commit 05c033db7e9a ("entry, treewide:
Make syscall_enter_from_user_mode[_work]() indicate syscall execution")
made syscall_enter_from_user_mode_randomize_stack() return false when
ptrace or seccomp skip the system call, and every in-kernel caller of
syscall_set_return_value() on the syscall entry path (SECCOMP_RET_ERRNO,
SECCOMP_RET_TRACE without a tracer, SECCOMP_RET_USER_NOTIF) also makes
it return false.  A system call with an invalid number, including
syscall(-1), still gets -ENOSYS.

Remove the flag.

Fixes: 69cb2be898be ("powerpc/syscall: Fix syscall skip handling for seccomp 
and ptrace")
Cc: [email protected] # v7.3
Suggested-by: Michal Suchánek <[email protected]>
Assisted-by: claude-opus-5-5
Signed-off-by: Renzo Davoli <[email protected]>
---
 arch/powerpc/include/asm/syscall.h     | 6 ------
 arch/powerpc/include/asm/thread_info.h | 1 -
 arch/powerpc/kernel/syscall.c          | 4 +---
 3 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/arch/powerpc/include/asm/syscall.h 
b/arch/powerpc/include/asm/syscall.h
index 32be22b995cc..4b3c52ed6e9d 100644
--- a/arch/powerpc/include/asm/syscall.h
+++ b/arch/powerpc/include/asm/syscall.h
@@ -98,12 +98,6 @@ static inline void syscall_set_return_value(struct 
task_struct *task,
                        regs->gpr[3] = val;
                }
        }
-       /*
-        * Mark that a return value has been explicitly set by seccomp or
-        * ptrace so that system_call_exception() can skip the syscall
-        * unconditionally, even when the user requested syscall(-1).
-        */
-       set_thread_flag(TIF_SYSCALL_RET);
 }
 
 static inline void syscall_get_arguments(struct task_struct *task,
diff --git a/arch/powerpc/include/asm/thread_info.h 
b/arch/powerpc/include/asm/thread_info.h
index 1e069a2e7ce8..0487e94d3416 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -120,7 +120,6 @@ void arch_setup_new_exec(void);
 #endif
 #define TIF_POLLING_NRFLAG     19      /* true if poll_idle() is polling 
TIF_NEED_RESCHED */
 #define TIF_32BIT              20      /* 32 bit binary */
-#define TIF_SYSCALL_RET                21      /* syscall error value set */
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c
index 8529827d697f..f7412556a9e8 100644
--- a/arch/powerpc/kernel/syscall.c
+++ b/arch/powerpc/kernel/syscall.c
@@ -18,9 +18,7 @@ notrace long system_call_exception(struct pt_regs *regs, 
unsigned long r0)
        long ret;
        syscall_fn f;
 
-       if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0) ||
-                       test_thread_flag(TIF_SYSCALL_RET))) {
-               clear_thread_flag(TIF_SYSCALL_RET);
+       if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0))) 
{
                return syscall_get_error(current, regs);
        }
 
-- 
2.55.0


Reply via email to