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>
}
}
}
+
+// 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)
+}
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