From ee26a1fd015319168f77b69f58bfe666b4048339 Mon Sep 17 00:00:00 2001 From: Michael Hoisie Date: Thu, 20 May 2010 17:13:50 -0700 Subject: 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 --- src/pkg/net/fd.go | 11 +++++++++-- 1 file 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 { -- cgit v1.2.3