]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ptrace: Always take siglock in ptrace_resume
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 29 Apr 2022 15:50:17 +0000 (10:50 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 11 May 2022 19:36:30 +0000 (14:36 -0500)
Make code analysis simpler and future changes easier by
always taking siglock in ptrace_resume.

Tested-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lkml.kernel.org/r/20220505182645.497868-11-ebiederm@xmission.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
kernel/ptrace.c

index 83ed2826270860a5c330e3e5b407f279eecdf5f3..36a5b7a00d2f2295cb75e38c52e8045422ec213d 100644 (file)
@@ -837,8 +837,6 @@ static long ptrace_get_rseq_configuration(struct task_struct *task,
 static int ptrace_resume(struct task_struct *child, long request,
                         unsigned long data)
 {
-       bool need_siglock;
-
        if (!valid_signal(data))
                return -EIO;
 
@@ -874,18 +872,11 @@ static int ptrace_resume(struct task_struct *child, long request,
         * Note that we need siglock even if ->exit_code == data and/or this
         * status was not reported yet, the new status must not be cleared by
         * wait_task_stopped() after resume.
-        *
-        * If data == 0 we do not care if wait_task_stopped() reports the old
-        * status and clears the code too; this can't race with the tracee, it
-        * takes siglock after resume.
         */
-       need_siglock = data && !thread_group_empty(current);
-       if (need_siglock)
-               spin_lock_irq(&child->sighand->siglock);
+       spin_lock_irq(&child->sighand->siglock);
        child->exit_code = data;
        wake_up_state(child, __TASK_TRACED);
-       if (need_siglock)
-               spin_unlock_irq(&child->sighand->siglock);
+       spin_unlock_irq(&child->sighand->siglock);
 
        return 0;
 }