ptrace/xtensa: Replace PT_SINGLESTEP with TIF_SINGLESTEP
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 26 Apr 2022 21:45:37 +0000 (16:45 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:22:29 +0000 (10:22 +0200)
commit 4a3d2717d140401df7501a95e454180831a0c5af upstream.

xtensa is the last user of the PT_SINGLESTEP flag.  Changing tsk->ptrace in
user_enable_single_step and user_disable_single_step without locking could
potentiallly cause problems.

So use a thread info flag instead of a flag in tsk->ptrace.  Use TIF_SINGLESTEP
that xtensa already had defined but unused.

Remove the definitions of PT_SINGLESTEP and PT_BLOCKSTEP as they have no more users.

Cc: stable@vger.kernel.org
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
Tested-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lkml.kernel.org/r/20220505182645.497868-4-ebiederm@xmission.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/xtensa/kernel/ptrace.c
arch/xtensa/kernel/signal.c
include/linux/ptrace.h

index bb3f479..db6cdea 100644 (file)
@@ -226,12 +226,12 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
 
 void user_enable_single_step(struct task_struct *child)
 {
-       child->ptrace |= PT_SINGLESTEP;
+       set_tsk_thread_flag(child, TIF_SINGLESTEP);
 }
 
 void user_disable_single_step(struct task_struct *child)
 {
-       child->ptrace &= ~PT_SINGLESTEP;
+       clear_tsk_thread_flag(child, TIF_SINGLESTEP);
 }
 
 /*
index c4d77db..f2b00f4 100644 (file)
@@ -465,7 +465,7 @@ static void do_signal(struct pt_regs *regs)
                /* Set up the stack frame */
                ret = setup_frame(&ksig, sigmask_to_save(), regs);
                signal_setup_done(ret, &ksig, 0);
-               if (current->ptrace & PT_SINGLESTEP)
+               if (test_thread_flag(TIF_SINGLESTEP))
                        task_pt_regs(current)->icountlevel = 1;
 
                return;
@@ -491,7 +491,7 @@ static void do_signal(struct pt_regs *regs)
        /* If there's no signal to deliver, we just restore the saved mask.  */
        restore_saved_sigmask();
 
-       if (current->ptrace & PT_SINGLESTEP)
+       if (test_thread_flag(TIF_SINGLESTEP))
                task_pt_regs(current)->icountlevel = 1;
        return;
 }
index 99610cc..d695c43 100644 (file)
@@ -46,12 +46,6 @@ extern int ptrace_access_vm(struct task_struct *tsk, unsigned long addr,
 #define PT_EXITKILL            (PTRACE_O_EXITKILL << PT_OPT_FLAG_SHIFT)
 #define PT_SUSPEND_SECCOMP     (PTRACE_O_SUSPEND_SECCOMP << PT_OPT_FLAG_SHIFT)
 
-/* single stepping state bits (used on ARM and PA-RISC) */
-#define PT_SINGLESTEP_BIT      31
-#define PT_SINGLESTEP          (1<<PT_SINGLESTEP_BIT)
-#define PT_BLOCKSTEP_BIT       30
-#define PT_BLOCKSTEP           (1<<PT_BLOCKSTEP_BIT)
-
 extern long arch_ptrace(struct task_struct *child, long request,
                        unsigned long addr, unsigned long data);
 extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);