summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorandre <andre@FreeBSD.org>2011-07-08 10:50:13 +0000
committerandre <andre@FreeBSD.org>2011-07-08 10:50:13 +0000
commit41fc3214dfa1da1f464192ffe878241cd3b9bf7a (patch)
treee745068211b2a01c9ead51df622151d2d28336e3 /sys/kern/uipc_socket.c
parent99a0b299b3e1499b4637e127d2dd98bbf780464e (diff)
downloadFreeBSD-src-41fc3214dfa1da1f464192ffe878241cd3b9bf7a.zip
FreeBSD-src-41fc3214dfa1da1f464192ffe878241cd3b9bf7a.tar.gz
In the experimental soreceive_stream():
o Move the non-blocking socket test below the SBS_CANTRCVMORE so that EOF is correctly returned on a remote connection close. o In the non-blocking socket test compare SS_NBIO against the so->so_state field instead of the incorrect sb->sb_state field. o Simplify the ENOTCONN test by removing cases that can't occur. Submitted by: trociny (with some further tweaks by committer) Tested by: trociny
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 89a1006..990c6ba 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1954,20 +1954,9 @@ soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
}
oresid = uio->uio_resid;
- /* We will never ever get anything unless we are connected. */
+ /* We will never ever get anything unless we are or were connected. */
if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
- /* When disconnecting there may be still some data left. */
- if (sb->sb_cc > 0)
- goto deliver;
- if (!(so->so_state & SS_ISDISCONNECTED))
- error = ENOTCONN;
- goto out;
- }
-
- /* Socket buffer is empty and we shall not block. */
- if (sb->sb_cc == 0 &&
- ((sb->sb_flags & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
- error = EAGAIN;
+ error = ENOTCONN;
goto out;
}
@@ -1994,6 +1983,13 @@ restart:
goto out;
}
+ /* Socket buffer is empty and we shall not block. */
+ if (sb->sb_cc == 0 &&
+ ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
+ error = EAGAIN;
+ goto out;
+ }
+
/* Socket buffer got some data that we shall deliver now. */
if (sb->sb_cc > 0 && !(flags & MSG_WAITALL) &&
((sb->sb_flags & SS_NBIO) ||
OpenPOWER on IntegriCloud