]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: fix nacl listener to not accept connections once closed
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 16 Oct 2015 04:41:34 +0000 (04:41 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 16 Oct 2015 14:43:17 +0000 (14:43 +0000)
Change-Id: I3ba6e97089ef6e69ba31dfb632df465859906a74
Reviewed-on: https://go-review.googlesource.com/15940
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/net_test.go
src/syscall/net_nacl.go

index 3907ce4aa5664096a8844d141e380d0fdb7b81c1..b91a9e3326a407752fbb00a4ebb6f162c17d9fdc 100644 (file)
@@ -208,7 +208,6 @@ func TestListenerClose(t *testing.T) {
                case "unix", "unixpacket":
                        defer os.Remove(ln.Addr().String())
                }
-               defer ln.Close()
 
                if err := ln.Close(); err != nil {
                        if perr := parseCloseError(err); perr != nil {
@@ -221,6 +220,14 @@ func TestListenerClose(t *testing.T) {
                        c.Close()
                        t.Fatal("should fail")
                }
+
+               if network == "tcp" {
+                       cc, err := Dial("tcp", ln.Addr().String())
+                       if err == nil {
+                               t.Error("Dial to closed TCP listener succeeeded.")
+                               cc.Close()
+                       }
+               }
        }
 }
 
index b5cb53030628657493d47e384638bd599d2d9838..a3633ad9e67a9cf4f4ba297ac30514d89781cb47 100644 (file)
@@ -577,7 +577,7 @@ func (f *netFile) connect(sa Sockaddr) error {
                return EISCONN
        }
        l, ok := net.listener[netAddr{f.proto, f.sotype, sa.key()}]
-       if !ok {
+       if !ok || l.listenerClosed() {
                net.Unlock()
                return ECONNREFUSED
        }
@@ -676,6 +676,12 @@ func (f *netFile) sendto(p []byte, flags int, to Sockaddr) error {
        return nil
 }
 
+func (f *netFile) listenerClosed() bool {
+       f.listener.Lock()
+       defer f.listener.Unlock()
+       return f.listener.closed
+}
+
 func (f *netFile) close() error {
        if f.listener != nil {
                f.listener.close()