diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2015-11-04 02:17:57 -0500 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2015-11-04 16:03:21 +0000 |
| commit | 8ee90fad125ffa4a5cf12d04958d26f8611cb581 (patch) | |
| tree | 784faf586429ef3d05942a6bbdab75ab14d53cdc /src | |
| parent | dc9ad5861d2ba0b57fea0998f2a85985096a5728 (diff) | |
| download | go-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.go | 23 | ||||
| -rw-r--r-- | src/syscall/net_nacl.go | 4 |
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 |
