From fcbd0da4a279b62144c60f4fd6556084c2a63004 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 6 May 2003 00:21:21 +0000 Subject: [PATCH] Fixed a couple of races with exiting threads in suspend_for_ptrace(). --- server/ptrace.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/ptrace.c b/server/ptrace.c index a185ca77238..bffe2e4c490 100644 --- a/server/ptrace.c +++ b/server/ptrace.c @@ -135,7 +135,7 @@ void sigchld_callback(void) } /* wait for a ptraced child to get a certain signal */ -static void wait4_thread( struct thread *thread, int signal ) +static int wait4_thread( struct thread *thread, int signal ) { int res, status; @@ -150,10 +150,11 @@ static void wait4_thread( struct thread *thread, int signal ) thread->attached = 0; } else perror( "wait4" ); - return; + return 0; } res = handle_child_status( thread, res, status, signal ); } while (res && res != signal); + return (thread->unix_pid != -1); } /* return the Unix pid to use in ptrace calls for a given thread */ @@ -199,8 +200,7 @@ static int attach_thread( struct thread *thread ) } if (debug_level) fprintf( stderr, "%04x: *attached*\n", thread->id ); thread->attached = 1; - wait4_thread( thread, SIGSTOP ); - return 1; + return wait4_thread( thread, SIGSTOP ); } /* detach from a Unix thread and kill it */ @@ -260,8 +260,8 @@ int suspend_for_ptrace( struct thread *thread ) if (thread->attached) { - send_thread_signal( thread, SIGSTOP ); - wait4_thread( thread, SIGSTOP ); + if (!send_thread_signal( thread, SIGSTOP )) goto error; + if (!wait4_thread( thread, SIGSTOP )) goto error; return 1; } if (attach_thread( thread )) return 1; -- 2.11.4.GIT