aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2015-11-04 02:17:57 -0500
committerBrad Fitzpatrick <bradfitz@golang.org>2015-11-04 16:03:21 +0000
commit8ee90fad125ffa4a5cf12d04958d26f8611cb581 (patch)
tree784faf586429ef3d05942a6bbdab75ab14d53cdc /src
parentdc9ad5861d2ba0b57fea0998f2a85985096a5728 (diff)
downloadgo-8ee90fad125ffa4a5cf12d04958d26f8611cb581.tar.xz
syscall: allow nacl's fake network code to Listen twice on the same address
Noticed from nacl trybot failures on new tests in https://golang.org/cl/16630 Related earlier fix of mine to nacl's listen code: syscall: fix nacl listener to not accept connections once closed https://go-review.googlesource.com/15940 Perhaps a better fix (in the future?) would be to remove the listener from the map at close, but that didn't seem entirely straightforward last time I looked into it. It's not my code, but it seems that the map entry continues to have a purpose even after Listener close. (?) But given that this code is only really used for running tests and the playground, this seems fine. Change-Id: I43bfedc57c07f215f4d79c18f588d3650687a48f Reviewed-on: https://go-review.googlesource.com/16650 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/net/net_test.go23
-rw-r--r--src/syscall/net_nacl.go4
2 files changed, 25 insertions, 2 deletions
diff --git a/src/net/net_test.go b/src/net/net_test.go
index b91a9e3326..e51745a033 100644
--- a/src/net/net_test.go
+++ b/src/net/net_test.go
@@ -261,3 +261,26 @@ func TestPacketConnClose(t *testing.T) {
}
}
}
+
+// nacl was previous failing to reuse an address.
+func TestListenCloseListen(t *testing.T) {
+ const maxTries = 10
+ for tries := 0; tries < maxTries; tries++ {
+ ln, err := newLocalListener("tcp")
+ if err != nil {
+ t.Fatal(err)
+ }
+ addr := ln.Addr().String()
+ if err := ln.Close(); err != nil {
+ t.Fatal(err)
+ }
+ ln, err = Listen("tcp", addr)
+ if err == nil {
+ // Success. nacl couldn't do this before.
+ ln.Close()
+ return
+ }
+ t.Errorf("failed on try %d/%d: %v", tries+1, maxTries, err)
+ }
+ t.Fatal("failed to listen/close/listen on same address after %d tries", maxTries)
+}
diff --git a/src/syscall/net_nacl.go b/src/syscall/net_nacl.go
index a3633ad9e6..d3378f9f66 100644
--- a/src/syscall/net_nacl.go
+++ b/src/syscall/net_nacl.go
@@ -526,8 +526,8 @@ func (f *netFile) listen(backlog int) error {
if f.listener != nil {
return EINVAL
}
- _, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
- if ok {
+ old, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
+ if ok && !old.listenerClosed() {
return EADDRINUSE
}
net.listener[netAddr{f.proto, f.sotype, f.addr.key()}] = f