The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=452187b611470a827215e9cd103a5616b8610662
commit 452187b611470a827215e9cd103a5616b8610662 Author: Gleb Smirnoff <gleb...@freebsd.org> AuthorDate: 2025-03-07 06:59:40 +0000 Commit: Gleb Smirnoff <gleb...@freebsd.org> CommitDate: 2025-03-07 06:59:40 +0000 inpcb: in_pcbinshash() now can't fail on connect(2) Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D49152 --- sys/netinet/in_pcb.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 08097ea8c1b9..8a99297f3818 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1178,27 +1178,19 @@ in_pcbconnect(struct inpcb *inp, struct sockaddr_in *sin, struct ucred *cred) else lport = inp->inp_lport; + MPASS(!in_nullhost(inp->inp_laddr) || inp->inp_lport != 0 || + !(inp->inp_flags & INP_INHASHLIST)); + inp->inp_faddr = faddr; inp->inp_fport = sin->sin_port; + inp->inp_laddr = laddr; + inp->inp_lport = lport; - /* Do the initial binding of the local address if required. */ - if (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0) { - inp->inp_lport = lport; - inp->inp_laddr = laddr; - if (in_pcbinshash(inp) != 0) { - inp->inp_laddr.s_addr = inp->inp_faddr.s_addr = - INADDR_ANY; - inp->inp_lport = inp->inp_fport = 0; - return (EAGAIN); - } - } else { - inp->inp_lport = lport; - inp->inp_laddr = laddr; - if ((inp->inp_flags & INP_INHASHLIST) != 0) - in_pcbrehash(inp); - else - in_pcbinshash(inp); - } + if ((inp->inp_flags & INP_INHASHLIST) == 0) { + error = in_pcbinshash(inp); + MPASS(error == 0); + } else + in_pcbrehash(inp); #ifdef ROUTE_MPATH if (CALC_FLOWID_OUTBOUND) { uint32_t hash_val, hash_type;