From 7f74824d9f47fe2f3c5893a110abdf7d243fba4f Mon Sep 17 00:00:00 2001 From: Alexandre Julliard <julliard@winehq.org> Date: Tue, 26 Dec 2000 00:30:30 +0000 Subject: [PATCH] Fixed error recovery during thread creation. --- server/process.c | 7 +++---- server/thread.c | 12 +++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/server/process.c b/server/process.c index c88bd40ccac..013dbc7e070 100644 --- a/server/process.c +++ b/server/process.c @@ -178,13 +178,12 @@ struct thread *create_process( int fd ) if ((process->next = first_process) != NULL) process->next->prev = process; first_process = process; - /* create the main thread */ - if (!(thread = create_thread( fd, process ))) goto error; - /* create the init done event */ if (!(process->init_event = create_event( NULL, 0, 1, 0 ))) goto error; - add_process_thread( process, thread ); + /* create the main thread */ + if (!(thread = create_thread( fd, process ))) goto error; + release_object( process ); return thread; diff --git a/server/thread.c b/server/thread.c index 272614068f4..20250d103da 100644 --- a/server/thread.c +++ b/server/thread.c @@ -91,7 +91,11 @@ static int alloc_client_buffer( struct thread *thread ) struct get_thread_buffer_request *req; int fd, fd_pipe[2]; - if (pipe( fd_pipe ) == -1) return -1; + if (pipe( fd_pipe ) == -1) + { + file_set_error(); + return 0; + } if ((fd = create_anonymous_file()) == -1) goto error; if (ftruncate( fd, MAX_REQUEST_LENGTH ) == -1) goto error; if ((thread->buffer = mmap( 0, MAX_REQUEST_LENGTH, PROT_READ | PROT_WRITE, @@ -106,6 +110,9 @@ static int alloc_client_buffer( struct thread *thread ) req->boot = (thread == booting_thread); req->version = SERVER_PROTOCOL_VERSION; + /* add it here since send_client_fd may call kill_thread */ + add_process_thread( thread->process, thread ); + send_client_fd( thread, fd_pipe[0], -1 ); send_client_fd( thread, fd, -1 ); send_reply( thread ); @@ -695,10 +702,9 @@ DECL_HANDLER(new_thread) send_client_fd( current, sock[1], req->handle ); close( sock[1] ); /* thread object will be released when the thread gets killed */ - add_process_thread( current->process, thread ); return; } - release_object( thread ); + kill_thread( thread, 1 ); } close( sock[1] ); } -- GitLab