]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix memory leaks on windows
authorDmitriy Vyukov <dvyukov@google.com>
Mon, 29 Jul 2013 16:01:13 +0000 (20:01 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Mon, 29 Jul 2013 16:01:13 +0000 (20:01 +0400)
Close netpoll descriptor along with socket.
Ensure that error paths close the descriptor as well.

R=golang-dev, mikioh.mikioh, alex.brainman
CC=golang-dev
https://golang.org/cl/11987043

src/pkg/net/fd_windows.go

index 548c04e374913a80c2b1c7eb9a1803ab3333b79d..5d584621a7142d3a00cd28d7992b5400a1270090 100644 (file)
@@ -288,7 +288,7 @@ func newFD(fd syscall.Handle, family, sotype int, net string) (*netFD, error) {
 func (fd *netFD) setAddr(laddr, raddr Addr) {
        fd.laddr = laddr
        fd.raddr = raddr
-       runtime.SetFinalizer(fd, (*netFD).closesocket)
+       runtime.SetFinalizer(fd, (*netFD).Close)
 }
 
 // Make new connection.
@@ -366,6 +366,9 @@ func (fd *netFD) decref() {
        fd.sysmu.Lock()
        fd.sysref--
        if fd.closing && fd.sysref == 0 && fd.sysfd != syscall.InvalidHandle {
+               // Poller may want to unregister fd in readiness notification mechanism,
+               // so this must be executed before closesocket.
+               fd.pd.Close()
                closesocket(fd.sysfd)
                fd.sysfd = syscall.InvalidHandle
                // no need for a finalizer anymore
@@ -409,10 +412,6 @@ func (fd *netFD) CloseWrite() error {
        return fd.shutdown(syscall.SHUT_WR)
 }
 
-func (fd *netFD) closesocket() error {
-       return closesocket(fd.sysfd)
-}
-
 // Read from network.
 
 type readOp struct {
@@ -585,14 +584,14 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
        o.newsock = s
        _, err = iosrv.ExecIO(&o)
        if err != nil {
-               closesocket(s)
+               netfd.Close()
                return nil, err
        }
 
        // Inherit properties of the listening socket.
        err = syscall.Setsockopt(s, syscall.SOL_SOCKET, syscall.SO_UPDATE_ACCEPT_CONTEXT, (*byte)(unsafe.Pointer(&fd.sysfd)), int32(unsafe.Sizeof(fd.sysfd)))
        if err != nil {
-               closesocket(s)
+               netfd.Close()
                return nil, &OpError{"Setsockopt", fd.net, fd.laddr, err}
        }