tcp: Disallow connecting a disconnected socket

Currently nothing prevents tcp_usr_connect() from attempting to connect
when the socket has been disconnected.  At the moment, doing so triggers
an assertion in in_pcbconnect() because inp_faddr is not unspecified.  I
believe this may have been caught in the past by TIMEWAIT checks, but
those are now removed.

Check for additional socket states in tcp_connect().

Reported by:	syzbot+f0f7871ec5397602b446@syzkaller.appspotmail.com
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D40579
This commit is contained in:
Mark Johnston 2023-06-23 09:59:52 -04:00
parent 6775ef4188
commit de0a2eb2ef

View file

@ -1464,7 +1464,8 @@ tcp_connect(struct tcpcb *tp, struct sockaddr_in *sin, struct thread *td)
INP_WLOCK_ASSERT(inp);
if (__predict_false((so->so_state &
(SS_ISCONNECTING | SS_ISCONNECTED)) != 0))
(SS_ISCONNECTING | SS_ISCONNECTED | SS_ISDISCONNECTING |
SS_ISDISCONNECTED)) != 0))
return (EISCONN);
INP_HASH_WLOCK(&V_tcbinfo);