]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: allow nacl's fake network code to Listen twice on the same address
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 4 Nov 2015 07:17:57 +0000 (02:17 -0500)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 4 Nov 2015 16:03:21 +0000 (16:03 +0000)
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>
src/net/net_test.go
src/syscall/net_nacl.go

index b91a9e3326a407752fbb00a4ebb6f162c17d9fdc..e51745a0333ebef05e1a50250a554bc53e29e9ba 100644 (file)
@@ -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)
+}
index a3633ad9e67a9cf4f4ba297ac30514d89781cb47..d3378f9f66e16fa2db204ae15dc0115bb49ada39 100644 (file)
@@ -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