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

Commit 6405f7f4 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

ptrace_stop: fix the race with ptrace detach+attach



If the tracer went away (may_ptrace_stop() failed), ptrace_stop() drops
tasklist and then changes the ->state from TASK_TRACED to TASK_RUNNING.

This can fool another tracer which attaches to us in between.  Change the
->state under tasklist_lock to ensure that ptrace_check_attach() can't wrongly
succeed.  Also, remove the unnecessary mb().

Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
Acked-by: default avatarRoland McGrath <roland@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c0c0b649
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1638,11 +1638,11 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
	} else {
		/*
		 * By the time we got the lock, our tracer went away.
		 * Don't stop here.
		 * Don't drop the lock yet, another tracer may come.
		 */
		read_unlock(&tasklist_lock);
		set_current_state(TASK_RUNNING);
		__set_current_state(TASK_RUNNING);
		current->exit_code = nostop_code;
		read_unlock(&tasklist_lock);
	}

	/*