diff options
author | Michael Hoisie <hoisie@gmail.com> | 2010-05-20 17:13:50 -0700 |
---|---|---|
committer | Michael Hoisie <hoisie@gmail.com> | 2010-05-20 17:13:50 -0700 |
commit | ee26a1fd015319168f77b69f58bfe666b4048339 (patch) | |
tree | 85d85de75fa3b0544cbab0080936d620fd1d186f | |
parent | 2acd9bf326ce7079b81245f6e4963fec2ca73c02 (diff) | |
download | golang-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>
-rw-r--r-- | src/pkg/net/fd.go | 11 |
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 { |