1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-24 16:52:12 +00:00

LibIPC: Make noise when shutting down because of an error

Previously, an IPC connection error could shut down the entire process
without giving a hint as to what's wrong. Now, we report that error to
the debug console.
This commit is contained in:
Jelle Raaijmakers 2022-06-10 17:21:00 +02:00 committed by Linus Groh
parent 1f736ced08
commit a39c38840e
3 changed files with 11 additions and 7 deletions

View file

@ -39,8 +39,7 @@ ErrorOr<void> ConnectionBase::post_message(MessageBuffer buffer)
#ifdef __serenity__ #ifdef __serenity__
for (auto& fd : buffer.fds) { for (auto& fd : buffer.fds) {
if (auto result = m_socket->send_fd(fd.value()); result.is_error()) { if (auto result = m_socket->send_fd(fd.value()); result.is_error()) {
dbgln("{}", result.error()); shutdown_with_error(result.error());
shutdown();
return result; return result;
} }
} }
@ -55,15 +54,13 @@ ErrorOr<void> ConnectionBase::post_message(MessageBuffer buffer)
if (maybe_nwritten.is_error()) { if (maybe_nwritten.is_error()) {
auto error = maybe_nwritten.release_error(); auto error = maybe_nwritten.release_error();
if (error.is_errno()) { if (error.is_errno()) {
shutdown_with_error(error);
switch (error.code()) { switch (error.code()) {
case EPIPE: case EPIPE:
shutdown();
return Error::from_string_literal("IPC::Connection::post_message: Disconnected from peer"sv); return Error::from_string_literal("IPC::Connection::post_message: Disconnected from peer"sv);
case EAGAIN: case EAGAIN:
shutdown();
return Error::from_string_literal("IPC::Connection::post_message: Peer buffer overflowed"sv); return Error::from_string_literal("IPC::Connection::post_message: Peer buffer overflowed"sv);
default: default:
shutdown();
return Error::from_syscall("IPC::Connection::post_message write"sv, -error.code()); return Error::from_syscall("IPC::Connection::post_message write"sv, -error.code());
} }
} else { } else {
@ -84,6 +81,12 @@ void ConnectionBase::shutdown()
die(); die();
} }
void ConnectionBase::shutdown_with_error(Error const& error)
{
dbgln("IPC::ConnectionBase ({:p}) had an error ({}), disconnecting.", this, error);
shutdown();
}
void ConnectionBase::handle_messages() void ConnectionBase::handle_messages()
{ {
auto messages = move(m_unprocessed_messages); auto messages = move(m_unprocessed_messages);

View file

@ -47,6 +47,7 @@ protected:
virtual void may_have_become_unresponsive() { } virtual void may_have_become_unresponsive() { }
virtual void did_become_responsive() { } virtual void did_become_responsive() { }
virtual void try_parse_messages(Vector<u8> const& bytes, size_t& index) = 0; virtual void try_parse_messages(Vector<u8> const& bytes, size_t& index) = 0;
virtual void shutdown_with_error(Error const&);
OwnPtr<IPC::Message> wait_for_specific_endpoint_message_impl(u32 endpoint_magic, int message_id); OwnPtr<IPC::Message> wait_for_specific_endpoint_message_impl(u32 endpoint_magic, int message_id);
void wait_for_socket_to_become_readable(); void wait_for_socket_to_become_readable();

View file

@ -52,9 +52,9 @@ public:
this->shutdown(); this->shutdown();
} }
void shutdown_with_error(Error const& error) virtual void shutdown_with_error(Error const& error) override
{ {
dbgln("{} (id={}) had error ({}), disconnecting.", *this, m_client_id, error); dbgln("{} (id={}) had an error ({}), disconnecting.", *this, m_client_id, error);
this->shutdown(); this->shutdown();
} }