Commit 1b2adad8 authored by Alexandre Julliard's avatar Alexandre Julliard

Don't try to detach from a thread that is exiting, to avoid triggering

a kernel race condition.
parent 3f24b916
...@@ -197,23 +197,6 @@ int send_thread_signal( struct thread *thread, int sig ) ...@@ -197,23 +197,6 @@ int send_thread_signal( struct thread *thread, int sig )
return (ret != -1); return (ret != -1);
} }
/* detach from a Unix thread and kill it */
void detach_thread( struct thread *thread, int sig )
{
if (thread->unix_pid == -1) return;
if (thread->attached)
{
/* make sure it is stopped */
suspend_for_ptrace( thread );
if (sig) send_thread_signal( thread, sig );
if (thread->unix_pid == -1) return;
if (debug_level) fprintf( stderr, "%04x: *detached*\n", thread->id );
ptrace( PTRACE_DETACH, get_ptrace_pid(thread), (caddr_t)1, sig );
thread->attached = 0;
}
else if (sig) send_thread_signal( thread, sig );
}
/* attach to a Unix process with ptrace */ /* attach to a Unix process with ptrace */
int attach_process( struct process *process ) int attach_process( struct process *process )
{ {
...@@ -242,7 +225,15 @@ void detach_process( struct process *process ) ...@@ -242,7 +225,15 @@ void detach_process( struct process *process )
LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry ) LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry )
{ {
if (thread->attached) detach_thread( thread, 0 ); if (thread->attached)
{
/* make sure it is stopped */
suspend_for_ptrace( thread );
if (thread->unix_pid == -1) return;
if (debug_level) fprintf( stderr, "%04x: *detached*\n", thread->id );
ptrace( PTRACE_DETACH, get_ptrace_pid(thread), (caddr_t)1, 0 );
thread->attached = 0;
}
} }
} }
......
...@@ -766,7 +766,7 @@ void kill_thread( struct thread *thread, int violent_death ) ...@@ -766,7 +766,7 @@ void kill_thread( struct thread *thread, int violent_death )
abandon_mutexes( thread ); abandon_mutexes( thread );
remove_process_thread( thread->process, thread ); remove_process_thread( thread->process, thread );
wake_up( &thread->obj, 0 ); wake_up( &thread->obj, 0 );
detach_thread( thread, violent_death ? SIGTERM : 0 ); if (violent_death) send_thread_signal( thread, SIGTERM );
cleanup_thread( thread ); cleanup_thread( thread );
release_object( thread ); release_object( thread );
} }
......
...@@ -122,7 +122,6 @@ extern struct token *thread_get_impersonation_token( struct thread *thread ); ...@@ -122,7 +122,6 @@ extern struct token *thread_get_impersonation_token( struct thread *thread );
extern void sigchld_callback(void); extern void sigchld_callback(void);
extern int get_ptrace_pid( struct thread *thread ); extern int get_ptrace_pid( struct thread *thread );
extern void detach_thread( struct thread *thread, int sig );
extern int attach_process( struct process *process ); extern int attach_process( struct process *process );
extern void detach_process( struct process *process ); extern void detach_process( struct process *process );
extern int suspend_for_ptrace( struct thread *thread ); extern int suspend_for_ptrace( struct thread *thread );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment