diff --git a/server/event.c b/server/event.c index 71c8a81dea0..47dde24ae75 100644 --- a/server/event.c +++ b/server/event.c @@ -215,7 +215,8 @@ DECL_HANDLER(event_op) reset_event( event ); break; default: - fatal_protocol_error( current, "event_op: invalid operation %d\n", req->op ); + set_error( STATUS_INVALID_PARAMETER ); + break; } release_object( event ); } diff --git a/server/process.c b/server/process.c index 3d531158162..0c71540bbc5 100644 --- a/server/process.c +++ b/server/process.c @@ -335,7 +335,7 @@ size_t init_process( struct thread *thread ) if (!process->handles) process->handles = alloc_handle_table( process, 0 ); if (!process->handles) { - fatal_protocol_error( thread, "Failed to allocate handle table\n" ); + set_error( STATUS_NO_MEMORY ); return 0; } @@ -895,7 +895,7 @@ DECL_HANDLER(init_process_done) if (is_process_init_done(process)) { - fatal_protocol_error( current, "init_process_done: called twice\n" ); + set_error( STATUS_INVALID_PARAMETER ); return; } if (!(dll = find_process_dll( process, req->module ))) diff --git a/server/request.c b/server/request.c index 9ae5fa4e7a9..a78916ec4f0 100644 --- a/server/request.c +++ b/server/request.c @@ -293,7 +293,11 @@ static void call_req_handler( struct thread *thread ) if (debug_level) trace_reply( req, &reply ); send_reply( &reply ); } - else fatal_protocol_error( current, "no reply fd for request %d\n", req ); + else + { + current->exit_code = 1; + kill_thread( current, 1 ); /* no way to continue without reply fd */ + } } current = NULL; } diff --git a/server/thread.c b/server/thread.c index bc8b4f4ed6c..40b9615d5eb 100644 --- a/server/thread.c +++ b/server/thread.c @@ -842,26 +842,22 @@ DECL_HANDLER(init_thread) int reply_fd = thread_get_inflight_fd( current, req->reply_fd ); int wait_fd = thread_get_inflight_fd( current, req->wait_fd ); - if (current->unix_pid != -1) + if (current->reply_fd) /* already initialised */ { - fatal_protocol_error( current, "init_thread: already running\n" ); - goto error; - } - if (reply_fd == -1 || fcntl( reply_fd, F_SETFL, O_NONBLOCK ) == -1) - { - fatal_protocol_error( current, "bad reply fd\n" ); + set_error( STATUS_INVALID_PARAMETER ); goto error; } + + if (reply_fd == -1 || fcntl( reply_fd, F_SETFL, O_NONBLOCK ) == -1) goto error; + + current->reply_fd = create_anonymous_fd( &thread_fd_ops, reply_fd, ¤t->obj ); + reply_fd = -1; + if (!current->reply_fd) goto error; + if (wait_fd == -1) { - fatal_protocol_error( current, "bad wait fd\n" ); - goto error; - } - if (!(current->reply_fd = create_anonymous_fd( &thread_fd_ops, reply_fd, ¤t->obj ))) - { - reply_fd = -1; - fatal_protocol_error( current, "could not allocate reply fd\n" ); - goto error; + set_error( STATUS_TOO_MANY_OPENED_FILES ); /* most likely reason */ + return; } if (!(current->wait_fd = create_anonymous_fd( &thread_fd_ops, wait_fd, ¤t->obj ))) return; diff --git a/server/trace.c b/server/trace.c index 5d2c5257777..9b5cc395d90 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3980,6 +3980,7 @@ static const struct { "SHARING_VIOLATION", STATUS_SHARING_VIOLATION }, { "SUSPEND_COUNT_EXCEEDED", STATUS_SUSPEND_COUNT_EXCEEDED }, { "TIMEOUT", STATUS_TIMEOUT }, + { "TOO_MANY_OPENED_FILES", STATUS_TOO_MANY_OPENED_FILES }, { "UNSUCCESSFUL", STATUS_UNSUCCESSFUL }, { "VOLUME_DISMOUNTED", STATUS_VOLUME_DISMOUNTED }, { "WAS_LOCKED", STATUS_WAS_LOCKED },