aboutsummaryrefslogtreecommitdiff
path: root/src/net/dial_test.go
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2017-06-07 21:01:48 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2017-06-08 22:20:17 +0000
commit78cf0e56ce5372ed3bf81e41e4ab23f68d3eaa77 (patch)
treed61bde4e5b2ada25cbbe4be22d30792d2cb6dd5e /src/net/dial_test.go
parentd8a7990ffad9aebfb7261df7afb3049da4a09986 (diff)
downloadgo-78cf0e56ce5372ed3bf81e41e4ab23f68d3eaa77.tar.gz
go-78cf0e56ce5372ed3bf81e41e4ab23f68d3eaa77.zip
net: make Dial("tcp", ln.Addr().String()) work even with bad IPv6 config
Some machines can be configured (or came/come configured) in such a state that IPv6 only half works: you can bind on [::]:n but not connect back to it. This implements a fallback such that it's guaranteed that this pattern works: ln, err := Listen("tcp", ":0") ... addr := ln.Addr().String() // "[::]:n" c, err := Dial("tcp", addr) ... which is also now tested. It will first try to dial "[::]:n", as before, but if that dial fails, it will also try "0.0.0.0:n". Fixes #18806 (contains more details) Fixes #20611 (I was going to fix nacl later, but it was easy enough) Change-Id: I1107eb197e902ae8185c781ad1bc4e2bc61d1f4c Reviewed-on: https://go-review.googlesource.com/45088 Reviewed-by: Paul Marks <pmarks@google.com>
Diffstat (limited to 'src/net/dial_test.go')
-rw-r--r--src/net/dial_test.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/net/dial_test.go b/src/net/dial_test.go
index a49a9d7426..59a016a0c5 100644
--- a/src/net/dial_test.go
+++ b/src/net/dial_test.go
@@ -887,3 +887,21 @@ func TestCancelAfterDial(t *testing.T) {
try()
}
}
+
+// Issue 18806: it should always be possible to net.Dial a
+// net.Listener().Addr().String when the listen address was ":n", even
+// if the machine has halfway configured IPv6 such that it can bind on
+// "::" not connect back to that same address.
+func TestDialListenerAddr(t *testing.T) {
+ ln, err := Listen("tcp", ":0")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer ln.Close()
+ addr := ln.Addr().String()
+ c, err := Dial("tcp", addr)
+ if err != nil {
+ t.Fatalf("for addr %q, dial error: %v", addr, err)
+ }
+ c.Close()
+}