server: Don't report a fatal protocol error for things that we can recover from.
diff --git a/server/event.c b/server/event.c index 71c8a81..47dde24 100644 --- a/server/event.c +++ b/server/event.c
@@ -215,7 +215,8 @@ 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 3d53115..0c71540 100644 --- a/server/process.c +++ b/server/process.c
@@ -335,7 +335,7 @@ 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 @@ 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 9ae5fa4..a78916e 100644 --- a/server/request.c +++ b/server/request.c
@@ -293,7 +293,11 @@ 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 bc8b4f4..40b9615 100644 --- a/server/thread.c +++ b/server/thread.c
@@ -842,26 +842,22 @@ 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" ); + set_error( STATUS_INVALID_PARAMETER ); goto error; } - if (reply_fd == -1 || fcntl( reply_fd, F_SETFL, O_NONBLOCK ) == -1) - { - fatal_protocol_error( current, "bad reply fd\n" ); - 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 5d2c525..9b5cc39 100644 --- a/server/trace.c +++ b/server/trace.c
@@ -3980,6 +3980,7 @@ { "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 },