aboutsummaryrefslogtreecommitdiff
path: root/src/pkg
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2013-07-29 20:01:13 +0400
committerDmitriy Vyukov <dvyukov@google.com>2013-07-29 20:01:13 +0400
commitb8734748b6b151a7fd724fc41e2555e6cd34385f (patch)
tree14cae90191356c30a2dea4eb2a35cf8be47f3fd3 /src/pkg
parent6350e45892b5b0189fe3461ba1e7f530da23ff8f (diff)
downloadgo-b8734748b6b151a7fd724fc41e2555e6cd34385f.tar.xz
net: fix memory leaks on windows
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
Diffstat (limited to 'src/pkg')
-rw-r--r--src/pkg/net/fd_windows.go13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/pkg/net/fd_windows.go b/src/pkg/net/fd_windows.go
index 548c04e374..5d584621a7 100644
--- a/src/pkg/net/fd_windows.go
+++ b/src/pkg/net/fd_windows.go
@@ -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}
}