lkml.org 
[lkml]   [2022]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 13/16] ptrace: Document why ptrace_setoptions does not need a lock
    The functions that change ->ptrace are: ptrace_attach, ptrace_traceme,
    ptrace_init_task, __ptrace_unlink, ptrace_setoptions.

    Except for ptrace_setoptions all of the places where ->ptrace is
    modified hold tasklist_lock for write, and either the tracee or the
    tracer is modifies ->ptrace.

    When ptrace_setoptions is called the tracee has been frozen with
    ptrace_freeze_traced, and most be explicitly unfrozen by the tracer
    before it can do anything. As ptrace_setoption is run in the tracer
    there can be no contention by the simple fact that the tracee can't
    run.

    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    ---
    kernel/ptrace.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/kernel/ptrace.c b/kernel/ptrace.c
    index d0527b6e2b29..fbadd2f21f09 100644
    --- a/kernel/ptrace.c
    +++ b/kernel/ptrace.c
    @@ -689,7 +689,10 @@ static int ptrace_setoptions(struct task_struct *child, unsigned long data)
    if (ret)
    return ret;

    - /* Avoid intermediate state when all opts are cleared */
    + /*
    + * With a frozen tracee, only the tracer modifies ->ptrace.
    + * Avoid intermediate state when all opts are cleared.
    + */
    flags = child->ptrace;
    flags &= ~(PTRACE_O_MASK << PT_OPT_FLAG_SHIFT);
    flags |= (data << PT_OPT_FLAG_SHIFT);
    --
    2.35.3
    \
     
     \ /
      Last update: 2022-05-19 01:00    [W:5.618 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site