From 85d2e8591236e534f572782cc875e2c5821b28e4 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 20 May 2019 02:54:52 +0200 Subject: [PATCH] LocalSocket: Fix mismatch between can_write() and write() logic. can_write() was saying yes in situations where write() would overflow the internal buffer. This patch adds a has_attached_peer() helper to make it easier to understand what's going on in these functions. --- Kernel/Net/LocalSocket.cpp | 29 +++++++++++++++++------------ Kernel/Net/LocalSocket.h | 1 + 2 files changed, 18 insertions(+), 12 deletions(-) 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;