From 0e9e70ca4fe1ab1fafd7b403da7cc0c6a8d65954 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 18 Nov 2019 17:30:45 +0100 Subject: [PATCH] IPv4: Disconnected non-blocking sockets were not signalling EOF After a socket has disconnected, we shouldn't return -EAGAIN. Instead we should allow userspace to read/recvfrom the socket until its packet queue has been exhausted. At that point, we now return 0, signalling EOF. It might be even better to start returning -ENOTCONN after signalling EOF once. I'm not sure how that should work, needs looking into. --- Kernel/Net/IPv4Socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 2e4dd1344b..3949fb5692 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -222,8 +222,14 @@ ssize_t IPv4Socket::recvfrom(FileDescription& description, void* buffer, size_t ReceivedPacket packet; { LOCKER(lock()); - if (m_receive_queue.is_empty() && !description.is_blocking()) - return -EAGAIN; + if (m_receive_queue.is_empty()) { + // FIXME: Shouldn't this return -ENOTCONN instead of EOF? + // But if so, we still need to deliver at least one EOF read to userspace.. right? + if (protocol_is_disconnected()) + return 0; + if (!description.is_blocking()) + return -EAGAIN; + } if (!m_receive_queue.is_empty()) { packet = m_receive_queue.take_first();