Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 321fb561 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Tejun Heo
Browse files

ptrace: ptrace_check_attach() should not do s/STOPPED/TRACED/



After "ptrace: Clean transitions between TASK_STOPPED and TRACED"
d79fdd6d, ptrace_check_attach()
should never see a TASK_STOPPED tracee and s/STOPPED/TRACED/ is
no longer legal. Add the warning.

Note: ptrace_check_attach() can be greatly simplified, in particular
it doesn't need tasklist. But I'd prefer another patch for that.

Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent ee77f075
Loading
Loading
Loading
Loading
+3 −5
Original line number Original line Diff line number Diff line
@@ -112,16 +112,14 @@ int ptrace_check_attach(struct task_struct *child, int kill)
	 */
	 */
	read_lock(&tasklist_lock);
	read_lock(&tasklist_lock);
	if ((child->ptrace & PT_PTRACED) && child->parent == current) {
	if ((child->ptrace & PT_PTRACED) && child->parent == current) {
		ret = 0;
		/*
		/*
		 * child->sighand can't be NULL, release_task()
		 * child->sighand can't be NULL, release_task()
		 * does ptrace_unlink() before __exit_signal().
		 * does ptrace_unlink() before __exit_signal().
		 */
		 */
		spin_lock_irq(&child->sighand->siglock);
		spin_lock_irq(&child->sighand->siglock);
		if (task_is_stopped(child))
		WARN_ON_ONCE(task_is_stopped(child));
			child->state = TASK_TRACED;
		if (task_is_traced(child) || kill)
		else if (!task_is_traced(child) && !kill)
			ret = 0;
			ret = -ESRCH;
		spin_unlock_irq(&child->sighand->siglock);
		spin_unlock_irq(&child->sighand->siglock);
	}
	}
	read_unlock(&tasklist_lock);
	read_unlock(&tasklist_lock);