Fixed a couple of races with exiting threads in suspend_for_ptrace().
diff --git a/server/ptrace.c b/server/ptrace.c
index a185ca7..bffe2e4 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -135,7 +135,7 @@
}
/* 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 @@
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 @@
}
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 @@
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;