conn: try harder to have v4 and v6 ports agree

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld
2021-02-09 18:45:12 +01:00
parent 78ebce6932
commit 30b96ba083
2 changed files with 14 additions and 0 deletions

View File

@@ -104,7 +104,11 @@ func createBind(port uint16) (Bind, uint16, error) {
var err error
var bind nativeBind
var newPort uint16
var tries int
originalPort := port
again:
port = originalPort
// Attempt ipv6 bind, update port if successful.
bind.sock6, newPort, err = create6(port)
if err != nil {
@@ -118,6 +122,10 @@ func createBind(port uint16) (Bind, uint16, error) {
// Attempt ipv4 bind, update port if successful.
bind.sock4, newPort, err = create4(port)
if err != nil {
if originalPort == 0 && err == syscall.EADDRINUSE && tries < 100 {
tries++
goto again
}
if err != syscall.EAFNOSUPPORT {
unix.Close(bind.sock6)
return nil, 0, err