1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:38:11 +00:00

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.
This commit is contained in:
Andreas Kling 2019-05-20 02:54:52 +02:00
parent 612e1c7023
commit 85d2e85912
2 changed files with 18 additions and 12 deletions

View file

@ -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();
}