From 910fab564e11547182660b8a04ec32178639b519 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 17 Aug 2019 11:04:45 +0200 Subject: [PATCH] LocalSocket: Make recvfrom() return 0 to signal EOF when peer is gone Once the peer has disconnected, recvfrom() should always return 0 once the socket buffer has been drained. --- Kernel/Net/LocalSocket.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 20345d611b..1d0309eb13 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -234,16 +234,24 @@ ssize_t LocalSocket::recvfrom(FileDescription& description, void* buffer, size_t auto role = this->role(description); if (role == Role::Accepted) { if (!description.is_blocking()) { - if (m_for_server.is_empty()) + if (m_for_server.is_empty()) { + if (!has_attached_peer(description)) + return 0; return -EAGAIN; + } } + ASSERT(!m_for_server.is_empty()); return m_for_server.read((u8*)buffer, buffer_size); } if (role == Role::Connected) { if (!description.is_blocking()) { - if (m_for_client.is_empty()) + if (m_for_client.is_empty()) { + if (!has_attached_peer(description)) + return 0; return -EAGAIN; + } } + ASSERT(!m_for_client.is_empty()); return m_for_client.read((u8*)buffer, buffer_size); } ASSERT_NOT_REACHED();