MFC r279821:

In TCP, connect() can return incorrect error code EINVAL
    instead of EADDRINUSE or ECONNREFUSED

    PR:                         196035
    Differential Revision:      https://reviews.freebsd.org/D1982
    Reported by:                Mark Nunberg <mnunberg@haskalah.org>
    Submitted by:               Harrison Grundy <harrison.grundy@astrodoggroup.com>
    Reviewed by:                adrian, jch, glebius, gnn
    Approved by:                jhb
This commit is contained in:
jch 2015-05-15 12:35:18 +00:00
parent c3c407f451
commit 47cc02d0cc

View File

@ -475,8 +475,12 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_connect: inp == NULL"));
INP_WLOCK(inp);
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
if (inp->inp_flags & INP_TIMEWAIT) {
error = EADDRINUSE;
goto out;
}
if (inp->inp_flags & INP_DROPPED) {
error = ECONNREFUSED;
goto out;
}
tp = intotcpcb(inp);
@ -522,8 +526,12 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_connect: inp == NULL"));
INP_WLOCK(inp);
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
if (inp->inp_flags & INP_TIMEWAIT) {
error = EADDRINUSE;
goto out;
}
if (inp->inp_flags & INP_DROPPED) {
error = ECONNREFUSED;
goto out;
}
tp = intotcpcb(inp);