]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix possible runtime.PollDesc leak when connect or listen fails
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 9 Apr 2013 03:41:58 +0000 (12:41 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 9 Apr 2013 03:41:58 +0000 (12:41 +0900)
Makes it possible to return the spent runtime.PollDesc to
runtime.pollcache descriptor pool when netFD.connect or
syscall.Listen fails.

Fixes #5219.

R=dvyukov, dave, bradfitz, adg
CC=golang-dev
https://golang.org/cl/8318044

src/pkg/net/fd_unix.go
src/pkg/net/sock_posix.go
src/pkg/net/tcpsock_posix.go
src/pkg/net/unixsock_posix.go

index f52c98a6c6e0fc33966d859b790e4c80f50f318a..c160faeceb0922ed56943f82b2ebf45681f71ab7 100644 (file)
@@ -122,12 +122,16 @@ func (fd *netFD) incref(closing bool) error {
 func (fd *netFD) decref() {
        fd.sysmu.Lock()
        fd.sysref--
-       if fd.closing && fd.sysref == 0 && fd.sysfile != nil {
+       if fd.closing && fd.sysref == 0 {
                // Poller may want to unregister fd in readiness notification mechanism,
                // so this must be executed before sysfile.Close().
                fd.pd.Close()
-               fd.sysfile.Close()
-               fd.sysfile = nil
+               if fd.sysfile != nil {
+                       fd.sysfile.Close()
+                       fd.sysfile = nil
+               } else {
+                       closesocket(fd.sysfd)
+               }
                fd.sysfd = -1
        }
        fd.sysmu.Unlock()
index e2487c805e985a2074a7ebf68d499bc3c09fb2fe..7e6a2c073dd52e8fe73a0b7e3b02ef910f74b25c 100644 (file)
@@ -58,7 +58,7 @@ func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr,
                        setWriteDeadline(fd, deadline)
                }
                if err = fd.connect(ursa); err != nil {
-                       closesocket(s)
+                       fd.Close()
                        return nil, err
                }
                fd.isConnected = true
index 8133ca1c118b3b5aa180fb413901717ecf303a80..2224e6a5e90d9c54972df157f849e755cc83c200 100644 (file)
@@ -288,7 +288,7 @@ func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) {
        }
        err = syscall.Listen(fd.sysfd, listenerBacklog)
        if err != nil {
-               closesocket(fd.sysfd)
+               fd.Close()
                return nil, &OpError{"listen", net, laddr, err}
        }
        return &TCPListener{fd}, nil
index 760d38f2731d1c505fc9e2cf01ff578a5da4eb29..6490cae77fa26c50e5f27081d5bb14722917f144 100644 (file)
@@ -271,7 +271,7 @@ func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
        }
        err = syscall.Listen(fd.sysfd, listenerBacklog)
        if err != nil {
-               closesocket(fd.sysfd)
+               fd.Close()
                return nil, &OpError{Op: "listen", Net: net, Addr: laddr, Err: err}
        }
        return &UnixListener{fd, laddr.Name}, nil