netFD: fix race between Close and Read/Write

Fixes #783.

R=rsc, cw
CC=golang-dev
https://golang.org/cl/1207043
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index 1fa537c..d7f2c9a 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -362,13 +362,16 @@
 }
 
 func (fd *netFD) Read(p []byte) (n int, err os.Error) {
-	if fd == nil || fd.sysfile == nil {
+	if fd == nil {
 		return 0, os.EINVAL
 	}
 	fd.rio.Lock()
 	defer fd.rio.Unlock()
 	fd.incref()
 	defer fd.decref()
+	if fd.sysfile == nil {
+		return 0, os.EINVAL
+	}
 	if fd.rdeadline_delta > 0 {
 		fd.rdeadline = pollserver.Now() + fd.rdeadline_delta
 	} else {
@@ -430,13 +433,16 @@
 }
 
 func (fd *netFD) Write(p []byte) (n int, err os.Error) {
-	if fd == nil || fd.sysfile == nil {
+	if fd == nil {
 		return 0, os.EINVAL
 	}
 	fd.wio.Lock()
 	defer fd.wio.Unlock()
 	fd.incref()
 	defer fd.decref()
+	if fd.sysfile == nil {
+		return 0, os.EINVAL
+	}
 	if fd.wdeadline_delta > 0 {
 		fd.wdeadline = pollserver.Now() + fd.wdeadline_delta
 	} else {
@@ -444,6 +450,7 @@
 	}
 	nn := 0
 	var oserr os.Error
+
 	for {
 		n, errno := syscall.Write(fd.sysfile.Fd(), p[nn:])
 		if n > 0 {