diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-11-18 17:30:45 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-11-18 17:37:54 +0100 |
commit | 0e9e70ca4fe1ab1fafd7b403da7cc0c6a8d65954 (patch) | |
tree | ddabf3631fa59917209b118aa8f183814c130373 /Kernel/Net | |
parent | b7a840fd0d18b002dbecc8553c52b514321472c6 (diff) | |
download | serenity-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.cpp | 10 |
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(); |