| From 4a3d2717d140401df7501a95e454180831a0c5af Mon Sep 17 00:00:00 2001 |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| Date: Tue, 26 Apr 2022 16:45:37 -0500 |
| Subject: ptrace/xtensa: Replace PT_SINGLESTEP with TIF_SINGLESTEP |
| |
| From: Eric W. Biederman <ebiederm@xmission.com> |
| |
| 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 | 4 ++-- |
| arch/xtensa/kernel/signal.c | 4 ++-- |
| include/linux/ptrace.h | 6 ------ |
| 3 files changed, 4 insertions(+), 10 deletions(-) |
| |
| --- a/arch/xtensa/kernel/ptrace.c |
| +++ b/arch/xtensa/kernel/ptrace.c |
| @@ -34,12 +34,12 @@ |
| |
| 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); |
| } |
| |
| /* |
| --- a/arch/xtensa/kernel/signal.c |
| +++ b/arch/xtensa/kernel/signal.c |
| @@ -458,7 +458,7 @@ static void do_signal(struct pt_regs *re |
| /* 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; |
| @@ -484,7 +484,7 @@ static void do_signal(struct pt_regs *re |
| /* 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; |
| } |
| --- a/include/linux/ptrace.h |
| +++ b/include/linux/ptrace.h |
| @@ -38,12 +38,6 @@ extern int ptrace_access_vm(struct task_ |
| #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); |