svn commit: r361037 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Thu May 14 17:54:09 UTC 2020
Author: kib
Date: Thu May 14 17:54:08 2020
New Revision: 361037
URL: https://svnweb.freebsd.org/changeset/base/361037
Log:
Fix spurious ENOTCONN from closed unix domain socket other' side.
Sometimes, when doing read(2) over unix domain socket, for which the
other side socket was closed, read(2) returns -1/ENOTCONN instead of
EOF AKA zero-size read. This is because soreceive_generic() does not
lock socket when testing the so_state SS_ISCONNECTED|SS_ISCONNECTING
flags. It could end up that we do not observe so->so_rcv.sb_state bit
SBS_CANTRCVMORE, and then miss SS_ flags.
Change the test to check that the socket was never connected before
returning ENOTCONN, by adding all state bits for connected.
Reported and tested by: pho
In collaboration with: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D24819
Modified:
head/sys/kern/uipc_socket.c
Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c Thu May 14 17:52:29 2020 (r361036)
+++ head/sys/kern/uipc_socket.c Thu May 14 17:54:08 2020 (r361037)
@@ -1969,8 +1969,9 @@ restart:
m = so->so_rcv.sb_mb;
goto dontblock;
}
- if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
- (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
+ if ((so->so_state & (SS_ISCONNECTING | SS_ISCONNECTED |
+ SS_ISDISCONNECTING | SS_ISDISCONNECTED)) == 0 &&
+ (so->so_proto->pr_flags & PR_CONNREQUIRED) != 0) {
SOCKBUF_UNLOCK(&so->so_rcv);
error = ENOTCONN;
goto release;
More information about the svn-src-all
mailing list