From 8ee90fad125ffa4a5cf12d04958d26f8611cb581 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 4 Nov 2015 02:17:57 -0500 Subject: [PATCH] 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 Reviewed-by: Ian Lance Taylor --- src/net/net_test.go | 23 +++++++++++++++++++++++ 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 -- 2.48.1