summaryrefslogtreecommitdiff
path: root/src/pkg/net/fd.go
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@gmail.com>2010-05-20 17:13:50 -0700
committerMichael Hoisie <hoisie@gmail.com>2010-05-20 17:13:50 -0700
commitee26a1fd015319168f77b69f58bfe666b4048339 (patch)
tree85d85de75fa3b0544cbab0080936d620fd1d186f /src/pkg/net/fd.go
parent2acd9bf326ce7079b81245f6e4963fec2ca73c02 (diff)
downloadgolang-ee26a1fd015319168f77b69f58bfe666b4048339.tar.gz
netFD: fix race between Close and Read/Write
Fixes issue 783. R=rsc, cw CC=golang-dev http://codereview.appspot.com/1207043 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/net/fd.go')
-rw-r--r--src/pkg/net/fd.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index 1fa537ccc..d7f2c9a5c 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -362,13 +362,16 @@ func (fd *netFD) Close() os.Error {
}
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) ReadFrom(p []byte) (n int, sa syscall.Sockaddr, err os.Error) {
}
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 @@ func (fd *netFD) Write(p []byte) (n int, err os.Error) {
}
nn := 0
var oserr os.Error
+
for {
n, errno := syscall.Write(fd.sysfile.Fd(), p[nn:])
if n > 0 {