diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index e0887103d6..8fa85c3606 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -144,9 +144,9 @@ bool LocalSocket::can_read(FileDescriptor& descriptor) const if (role == SocketRole::Listener) return can_accept(); if (role == SocketRole::Accepted) - return (!m_connected_fds_open && !m_connecting_fds_open) || !m_for_server.is_empty(); + return !has_attached_peer(descriptor) || !m_for_server.is_empty(); if (role == SocketRole::Connected) - return !m_accepted_fds_open || !m_for_client.is_empty(); + return !has_attached_peer(descriptor) || !m_for_client.is_empty(); ASSERT_NOT_REACHED(); } @@ -170,27 +170,32 @@ ssize_t LocalSocket::read(FileDescriptor& descriptor, byte* buffer, ssize_t size ASSERT_NOT_REACHED(); } +bool LocalSocket::has_attached_peer(const FileDescriptor& descriptor) const +{ + if (descriptor.socket_role() == SocketRole::Accepted) + return m_connected_fds_open || m_connecting_fds_open; + if (descriptor.socket_role() == SocketRole::Connected) + return m_accepted_fds_open; + ASSERT_NOT_REACHED(); +} + ssize_t LocalSocket::write(FileDescriptor& descriptor, const byte* data, ssize_t size) { - if (descriptor.socket_role() == SocketRole::Accepted) { - if (!m_accepted_fds_open) - return -EPIPE; + if (!has_attached_peer(descriptor)) + return -EPIPE; + if (descriptor.socket_role() == SocketRole::Accepted) return m_for_client.write(data, size); - } - if (descriptor.socket_role() == SocketRole::Connected) { - if (!m_connected_fds_open && !m_connecting_fds_open) - return -EPIPE; + if (descriptor.socket_role() == SocketRole::Connected) return m_for_server.write(data, size); - } ASSERT_NOT_REACHED(); } bool LocalSocket::can_write(FileDescriptor& descriptor) const { if (descriptor.socket_role() == SocketRole::Accepted) - return (!m_connected_fds_open && !m_connecting_fds_open) || m_for_client.bytes_in_write_buffer() < 4096; + return !has_attached_peer(descriptor) || m_for_client.bytes_in_write_buffer() < 4096; if (descriptor.socket_role() == SocketRole::Connected) - return !m_accepted_fds_open || m_for_server.bytes_in_write_buffer() < 4096; + return !has_attached_peer(descriptor) || m_for_server.bytes_in_write_buffer() < 4096; ASSERT_NOT_REACHED(); } diff --git a/Kernel/Net/LocalSocket.h b/Kernel/Net/LocalSocket.h index b8c41c1ea7..81b902a982 100644 --- a/Kernel/Net/LocalSocket.h +++ b/Kernel/Net/LocalSocket.h @@ -25,6 +25,7 @@ public: private: explicit LocalSocket(int type); virtual bool is_local() const override { return true; } + bool has_attached_peer(const FileDescriptor&) const; RetainPtr m_file;