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
This commit is contained in:
parent
13e255fab7
commit
695da99eba
@ -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 @@ soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
|
||||
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) ||
|
||||
|
Loading…
Reference in New Issue
Block a user