]> Cypherpunks repositories - gostls13.git/commitdiff
netFD: fix race between Close and Read/Write
authorMichael Hoisie <hoisie@gmail.com>
Fri, 21 May 2010 00:13:50 +0000 (17:13 -0700)
committerRuss Cox <rsc@golang.org>
Fri, 21 May 2010 00:13:50 +0000 (17:13 -0700)
Fixes #783.

R=rsc, cw
CC=golang-dev
https://golang.org/cl/1207043

src/pkg/net/fd.go

index 1fa537cccd3608402e07cd232033e4f2d1b34db3..d7f2c9a5c4db6cc935c481fca6e05c637f92c45f 100644 (file)
@@ -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 {