diff options
author | jlemon <jlemon@FreeBSD.org> | 2001-03-09 08:16:40 +0000 |
---|---|---|
committer | jlemon <jlemon@FreeBSD.org> | 2001-03-09 08:16:40 +0000 |
commit | 50bffc6c06aca836443e915bf84b611c97ee5c19 (patch) | |
tree | 62d7942d27fad82cda790598df2a606d5b543fee | |
parent | e8c0cc0af2cba10cc1a43be82ba2a811596cbf73 (diff) | |
download | FreeBSD-src-50bffc6c06aca836443e915bf84b611c97ee5c19.zip FreeBSD-src-50bffc6c06aca836443e915bf84b611c97ee5c19.tar.gz |
Push the test for a disconnected socket when accept()ing down to the
protocol layer. Not all protocols behave identically. This fixes the
brokenness observed with unix-domain sockets (and postfix)
-rw-r--r-- | sys/kern/uipc_socket.c | 5 | ||||
-rw-r--r-- | sys/netinet/tcp_usrreq.c | 8 |
2 files changed, 9 insertions, 4 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index f4237a0..ef4ac59 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -360,10 +360,7 @@ soaccept(so, nam) if ((so->so_state & SS_NOFDREF) == 0) panic("soaccept: !NOFDREF"); so->so_state &= ~SS_NOFDREF; - if ((so->so_state & SS_ISDISCONNECTED) == 0) - error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); - else - error = ECONNABORTED; + error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); splx(s); return (error); } diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 1d64581..2b76f98 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -419,6 +419,10 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam) struct inpcb *inp = sotoinpcb(so); struct tcpcb *tp; + if (so->so_state & SS_ISDISCONNECTED) { + error = ECONNABORTED; + goto out; + } COMMON_START(); in_setpeeraddr(so, nam); COMMON_END(PRU_ACCEPT); @@ -433,6 +437,10 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam) struct inpcb *inp = sotoinpcb(so); struct tcpcb *tp; + if (so->so_state & SS_ISDISCONNECTED) { + error = ECONNABORTED; + goto out; + } COMMON_START(); in6_mapped_peeraddr(so, nam); COMMON_END(PRU_ACCEPT); |