Fixed error recovery during thread creation.
diff --git a/server/process.c b/server/process.c
index c88bd40..013dbc7 100644
--- a/server/process.c
+++ b/server/process.c
@@ -178,13 +178,12 @@
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 2726140..20250d1 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -91,7 +91,11 @@
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 @@
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 @@
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] );
}