summaryrefslogtreecommitdiff
path: root/Kernel/Net
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-11-18 17:30:45 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-11-18 17:37:54 +0100
commit0e9e70ca4fe1ab1fafd7b403da7cc0c6a8d65954 (patch)
treeddabf3631fa59917209b118aa8f183814c130373 /Kernel/Net
parentb7a840fd0d18b002dbecc8553c52b514321472c6 (diff)
downloadserenity-0e9e70ca4fe1ab1fafd7b403da7cc0c6a8d65954.zip
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.
Diffstat (limited to 'Kernel/Net')
-rw-r--r--Kernel/Net/IPv4Socket.cpp10
1 files 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();