fengbojiang(姜凤波) 2019-01-18 16:08:40 +08:00
commit 2bc927fd77
2 changed files with 18 additions and 7 deletions

View File

@ -1126,7 +1126,10 @@ if (lport == 0)
ifp_sin.sin_len = sizeof(ifp_sin); ifp_sin.sin_len = sizeof(ifp_sin);
ifa = ifa_ifwithnet((struct sockaddr *)&ifp_sin, 0, RT_ALL_FIBS); ifa = ifa_ifwithnet((struct sockaddr *)&ifp_sin, 0, RT_ALL_FIBS);
if (ifa == NULL) { if (ifa == NULL) {
return (EADDRNOTAVAIL); ifp_sin.sin_addr.s_addr = faddr.s_addr;
ifa = ifa_ifwithnet((struct sockaddr *)&ifp_sin, 0, RT_ALL_FIBS);
if ( ifa == NULL )
return (EADDRNOTAVAIL);
} }
ifp = ifa->ifa_ifp; ifp = ifa->ifa_ifp;
while (lport == 0) { while (lport == 0) {

View File

@ -1321,14 +1321,22 @@ tcp_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
error = EADDRINUSE; error = EADDRINUSE;
goto out; goto out;
} }
// inp->inp_lport != lport means in_pcbconnect_setup selected new port to inp->inp_lport.
// inp will inhash.
if (in_pcbinshash(inp) != 0) {
inp->inp_laddr.s_addr = INADDR_ANY;
inp->inp_lport = 0;
return (EAGAIN);
}
} }
else
if (in_pcbinshash(inp) != 0) { {
inp->inp_laddr.s_addr = INADDR_ANY; // app call bind() and connect(), lport is set when bind, and the inp is inhashed in bind() function.
inp->inp_lport = 0; // in_pcbconnect_setup() update inp->inp_faddr/inp->inp_fport, so inp should be rehashed.
return (EAGAIN); in_pcbrehash(inp);
} }
if (anonport) { if (anonport) {
inp->inp_flags |= INP_ANONPORT; inp->inp_flags |= INP_ANONPORT;
} }