server: Don't report a fatal protocol error for things that we can recover from.

This commit is contained in:
Alexandre Julliard 2006-06-08 10:26:02 +02:00
parent 3575918411
commit 5558652ea3
5 changed files with 21 additions and 19 deletions

View File

@ -215,7 +215,8 @@ DECL_HANDLER(event_op)
reset_event( event ); reset_event( event );
break; break;
default: default:
fatal_protocol_error( current, "event_op: invalid operation %d\n", req->op ); set_error( STATUS_INVALID_PARAMETER );
break;
} }
release_object( event ); release_object( event );
} }

View File

@ -335,7 +335,7 @@ size_t init_process( struct thread *thread )
if (!process->handles) process->handles = alloc_handle_table( process, 0 ); if (!process->handles) process->handles = alloc_handle_table( process, 0 );
if (!process->handles) if (!process->handles)
{ {
fatal_protocol_error( thread, "Failed to allocate handle table\n" ); set_error( STATUS_NO_MEMORY );
return 0; return 0;
} }
@ -895,7 +895,7 @@ DECL_HANDLER(init_process_done)
if (is_process_init_done(process)) if (is_process_init_done(process))
{ {
fatal_protocol_error( current, "init_process_done: called twice\n" ); set_error( STATUS_INVALID_PARAMETER );
return; return;
} }
if (!(dll = find_process_dll( process, req->module ))) if (!(dll = find_process_dll( process, req->module )))

View File

@ -293,7 +293,11 @@ static void call_req_handler( struct thread *thread )
if (debug_level) trace_reply( req, &reply ); if (debug_level) trace_reply( req, &reply );
send_reply( &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; current = NULL;
} }

View File

@ -842,26 +842,22 @@ DECL_HANDLER(init_thread)
int reply_fd = thread_get_inflight_fd( current, req->reply_fd ); int reply_fd = thread_get_inflight_fd( current, req->reply_fd );
int wait_fd = thread_get_inflight_fd( current, req->wait_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; 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, &current->obj );
reply_fd = -1;
if (!current->reply_fd) goto error;
if (wait_fd == -1) if (wait_fd == -1)
{ {
fatal_protocol_error( current, "bad wait fd\n" ); set_error( STATUS_TOO_MANY_OPENED_FILES ); /* most likely reason */
goto error; return;
}
if (!(current->reply_fd = create_anonymous_fd( &thread_fd_ops, reply_fd, &current->obj )))
{
reply_fd = -1;
fatal_protocol_error( current, "could not allocate reply fd\n" );
goto error;
} }
if (!(current->wait_fd = create_anonymous_fd( &thread_fd_ops, wait_fd, &current->obj ))) if (!(current->wait_fd = create_anonymous_fd( &thread_fd_ops, wait_fd, &current->obj )))
return; return;

View File

@ -3980,6 +3980,7 @@ static const struct
{ "SHARING_VIOLATION", STATUS_SHARING_VIOLATION }, { "SHARING_VIOLATION", STATUS_SHARING_VIOLATION },
{ "SUSPEND_COUNT_EXCEEDED", STATUS_SUSPEND_COUNT_EXCEEDED }, { "SUSPEND_COUNT_EXCEEDED", STATUS_SUSPEND_COUNT_EXCEEDED },
{ "TIMEOUT", STATUS_TIMEOUT }, { "TIMEOUT", STATUS_TIMEOUT },
{ "TOO_MANY_OPENED_FILES", STATUS_TOO_MANY_OPENED_FILES },
{ "UNSUCCESSFUL", STATUS_UNSUCCESSFUL }, { "UNSUCCESSFUL", STATUS_UNSUCCESSFUL },
{ "VOLUME_DISMOUNTED", STATUS_VOLUME_DISMOUNTED }, { "VOLUME_DISMOUNTED", STATUS_VOLUME_DISMOUNTED },
{ "WAS_LOCKED", STATUS_WAS_LOCKED }, { "WAS_LOCKED", STATUS_WAS_LOCKED },