From: Brad Fitzpatrick Date: Fri, 16 Oct 2015 04:41:34 +0000 (+0000) Subject: syscall: fix nacl listener to not accept connections once closed X-Git-Tag: go1.6beta1~830 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=19aa4209aebce5deaf485268e210ed3fc29cacd5;p=gostls13.git syscall: fix nacl listener to not accept connections once closed Change-Id: I3ba6e97089ef6e69ba31dfb632df465859906a74 Reviewed-on: https://go-review.googlesource.com/15940 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Minux Ma Reviewed-by: Ian Lance Taylor --- diff --git a/src/net/net_test.go b/src/net/net_test.go index 3907ce4aa5..b91a9e3326 100644 --- a/src/net/net_test.go +++ b/src/net/net_test.go @@ -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() + } + } } } diff --git a/src/syscall/net_nacl.go b/src/syscall/net_nacl.go index b5cb530306..a3633ad9e6 100644 --- a/src/syscall/net_nacl.go +++ b/src/syscall/net_nacl.go @@ -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()