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