Commit 5b4197cb authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

ptrace: Always take siglock in ptrace_resume



Make code analysis simpler and future changes easier by
always taking siglock in ptrace_resume.

Tested-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Link: https://lkml.kernel.org/r/20220505182645.497868-11-ebiederm@xmission.com


Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 2500ad1c
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -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,17 +872,10 @@ 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);
	child->exit_code = data;
	wake_up_state(child, __TASK_TRACED);
	if (need_siglock)
	spin_unlock_irq(&child->sighand->siglock);

	return 0;