net: fix memory leak on unix
If netFD is closed by finalizer, runtime netpoll descriptor is not freed.

R=golang-dev, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/12037043
diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go
index 4012e36..5f8a670 100644
--- a/src/pkg/net/fd_unix.go
+++ b/src/pkg/net/fd_unix.go
@@ -9,6 +9,7 @@
 import (
 	"io"
 	"os"
+	"runtime"
 	"sync"
 	"syscall"
 	"time"
@@ -29,7 +30,6 @@
 	family      int
 	sotype      int
 	isConnected bool
-	sysfile     *os.File
 	net         string
 	laddr       Addr
 	raddr       Addr
@@ -70,7 +70,7 @@
 func (fd *netFD) setAddr(laddr, raddr Addr) {
 	fd.laddr = laddr
 	fd.raddr = raddr
-	fd.sysfile = os.NewFile(uintptr(fd.sysfd), fd.net)
+	runtime.SetFinalizer(fd, (*netFD).Close)
 }
 
 func (fd *netFD) name() string {
@@ -129,15 +129,11 @@
 	fd.sysref--
 	if fd.closing && fd.sysref == 0 {
 		// Poller may want to unregister fd in readiness notification mechanism,
-		// so this must be executed before sysfile.Close().
+		// so this must be executed before closesocket.
 		fd.pd.Close()
-		if fd.sysfile != nil {
-			fd.sysfile.Close()
-			fd.sysfile = nil
-		} else {
-			closesocket(fd.sysfd)
-		}
+		closesocket(fd.sysfd)
 		fd.sysfd = -1
+		runtime.SetFinalizer(fd, nil)
 	}
 	fd.sysmu.Unlock()
 }