Make local port which is bound during connect(2) unique per laddr.
authorbluhm <bluhm@openbsd.org>
Fri, 22 Mar 2024 18:05:01 +0000 (18:05 +0000)
committerbluhm <bluhm@openbsd.org>
Fri, 22 Mar 2024 18:05:01 +0000 (18:05 +0000)
commit97ca6483dad3629b30f7d3c616adf94f36009e8e
tree7625fe3594bfec2c4faeca845c51398b0d545494
parentfdada4b1d06e7ba496cc0badc521a16b3635267a
Make local port which is bound during connect(2) unique per laddr.

in_pcbconnect() did not pass down the address it got from in_pcbselsrc()
to in_pcbpickport().  As a consequence local port numbers selected
during connect(2) were globally unique although they belong to
different addresses.  This strict uniqueness is not necessary and
wastes usable ports for outgoing connections.

To solve this, pass ina from in_pcbconnect() to in_pcbbind_locked().
This does not interfere how wildcard sockets are matched with
specific sockets during bind(2).  It only allows non-wildcard sockets
to share a local port during connect(2).

OK mvs@ deraadt@
sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet6/in6_pcb.c