From 9192ec2ea1d3c76d4346f3abbc092a248e574aab Mon Sep 17 00:00:00 2001 From: Michael Hoisie Date: Thu, 20 May 2010 17:13:50 -0700 Subject: [PATCH] netFD: fix race between Close and Read/Write Fixes #783. R=rsc, cw CC=golang-dev https://golang.org/cl/1207043 --- 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 1fa537cccd..d7f2c9a5c4 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 { -- 2.48.1