From: Denys Vlasenko Date: Fri, 21 Jun 2013 13:50:41 +0000 (+0200) Subject: Eat pending SIGSTOP _before_ PTRACE_DETACH in detach() X-Git-Tag: v4.9~230 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a2de9dacec47b7902b19f37edcc564faff346816;p=strace Eat pending SIGSTOP _before_ PTRACE_DETACH in detach() * strace.c (detach): If TCB_IGNORE_ONE_SIGSTOP is set, di not PTRACE_DETACH - wait for SIGSTOP first. Signed-off-by: Denys Vlasenko --- diff --git a/strace.c b/strace.c index 89e89bc3..55089bf3 100644 --- a/strace.c +++ b/strace.c @@ -758,6 +758,8 @@ detach(struct tcb *tcp) * would be left stopped (process state T). */ sigstop_expected = (tcp->flags & TCB_IGNORE_ONE_SIGSTOP); + if (sigstop_expected) + goto wait_loop; error = ptrace(PTRACE_DETACH, tcp->pid, 0, 0); if (error == 0) { /* On a clear day, you can see forever. */ @@ -802,6 +804,7 @@ detach(struct tcb *tcp) } if (sigstop_expected || interrupt_done) { + wait_loop: for (;;) { int sig; if (waitpid(tcp->pid, &status, __WALL) < 0) {