lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 036/667] ptrace/um: Replace PT_DTRACE with TIF_SINGLESTEP
    Date
    From: Eric W. Biederman <ebiederm@xmission.com>

    commit c200e4bb44e80b343c09841e7caaaca0aac5e5fa upstream.

    User mode linux is the last user of the PT_DTRACE flag. Using the flag to indicate
    single stepping is a little confusing and worse changing tsk->ptrace without locking
    could potentionally cause problems.

    So use a thread info flag with a better name instead of flag in tsk->ptrace.

    Remove the definition PT_DTRACE as uml is the last user.

    Cc: stable@vger.kernel.org
    Acked-by: Johannes Berg <johannes@sipsolutions.net>
    Tested-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: Oleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-3-ebiederm@xmission.com
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/um/include/asm/thread_info.h | 2 ++
    arch/um/kernel/exec.c | 2 +-
    arch/um/kernel/process.c | 2 +-
    arch/um/kernel/ptrace.c | 8 ++++----
    arch/um/kernel/signal.c | 4 ++--
    include/linux/ptrace.h | 1 -
    6 files changed, 10 insertions(+), 9 deletions(-)

    --- a/arch/um/include/asm/thread_info.h
    +++ b/arch/um/include/asm/thread_info.h
    @@ -64,6 +64,7 @@ static inline struct thread_info *curren
    #define TIF_RESTORE_SIGMASK 7
    #define TIF_NOTIFY_RESUME 8
    #define TIF_SECCOMP 9 /* secure computing */
    +#define TIF_SINGLESTEP 10 /* single stepping userspace */

    #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
    #define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
    @@ -72,5 +73,6 @@ static inline struct thread_info *curren
    #define _TIF_MEMDIE (1 << TIF_MEMDIE)
    #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
    #define _TIF_SECCOMP (1 << TIF_SECCOMP)
    +#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)

    #endif
    --- a/arch/um/kernel/exec.c
    +++ b/arch/um/kernel/exec.c
    @@ -42,7 +42,7 @@ void start_thread(struct pt_regs *regs,
    {
    PT_REGS_IP(regs) = eip;
    PT_REGS_SP(regs) = esp;
    - current->ptrace &= ~PT_DTRACE;
    + clear_thread_flag(TIF_SINGLESTEP);
    #ifdef SUBARCH_EXECVE1
    SUBARCH_EXECVE1(regs->regs);
    #endif
    --- a/arch/um/kernel/process.c
    +++ b/arch/um/kernel/process.c
    @@ -339,7 +339,7 @@ int singlestepping(void * t)
    {
    struct task_struct *task = t ? t : current;

    - if (!(task->ptrace & PT_DTRACE))
    + if (!test_thread_flag(TIF_SINGLESTEP))
    return 0;

    if (task->thread.singlestep_syscall)
    --- a/arch/um/kernel/ptrace.c
    +++ b/arch/um/kernel/ptrace.c
    @@ -12,7 +12,7 @@

    void user_enable_single_step(struct task_struct *child)
    {
    - child->ptrace |= PT_DTRACE;
    + set_tsk_thread_flag(child, TIF_SINGLESTEP);
    child->thread.singlestep_syscall = 0;

    #ifdef SUBARCH_SET_SINGLESTEPPING
    @@ -22,7 +22,7 @@ void user_enable_single_step(struct task

    void user_disable_single_step(struct task_struct *child)
    {
    - child->ptrace &= ~PT_DTRACE;
    + clear_tsk_thread_flag(child, TIF_SINGLESTEP);
    child->thread.singlestep_syscall = 0;

    #ifdef SUBARCH_SET_SINGLESTEPPING
    @@ -121,7 +121,7 @@ static void send_sigtrap(struct uml_pt_r
    }

    /*
    - * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
    + * XXX Check TIF_SINGLESTEP for singlestepping check and
    * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
    */
    int syscall_trace_enter(struct pt_regs *regs)
    @@ -145,7 +145,7 @@ void syscall_trace_leave(struct pt_regs
    audit_syscall_exit(regs);

    /* Fake a debug trap */
    - if (ptraced & PT_DTRACE)
    + if (test_thread_flag(TIF_SINGLESTEP))
    send_sigtrap(&regs->regs, 0);

    if (!test_thread_flag(TIF_SYSCALL_TRACE))
    --- a/arch/um/kernel/signal.c
    +++ b/arch/um/kernel/signal.c
    @@ -53,7 +53,7 @@ static void handle_signal(struct ksignal
    unsigned long sp;
    int err;

    - if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED))
    + if (test_thread_flag(TIF_SINGLESTEP) && (current->ptrace & PT_PTRACED))
    singlestep = 1;

    /* Did we come from a system call? */
    @@ -128,7 +128,7 @@ void do_signal(struct pt_regs *regs)
    * on the host. The tracing thread will check this flag and
    * PTRACE_SYSCALL if necessary.
    */
    - if (current->ptrace & PT_DTRACE)
    + if (test_thread_flag(TIF_SINGLESTEP))
    current->thread.singlestep_syscall =
    is_syscall(PT_REGS_IP(&current->thread.regs));

    --- a/include/linux/ptrace.h
    +++ b/include/linux/ptrace.h
    @@ -30,7 +30,6 @@ extern int ptrace_access_vm(struct task_

    #define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */
    #define PT_PTRACED 0x00000001
    -#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */

    #define PT_OPT_FLAG_SHIFT 3
    /* PT_TRACE_* event enable flags */

    \
     
     \ /
      Last update: 2022-06-07 20:19    [W:3.808 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site