diff options
author | Devon H. O'Dell <devon.odell@gmail.com> | 2009-12-01 23:28:57 -0800 |
---|---|---|
committer | Devon H. O'Dell <devon.odell@gmail.com> | 2009-12-01 23:28:57 -0800 |
commit | 973d7ce551fafd0d5144cc5c4ada7826ca42275b (patch) | |
tree | 3d428a64096c45ce29301e4ecc1ce7795638d9b3 /src/pkg/net/sock.go | |
parent | 31c8897d027204d54377e19337a7af3f1c73e5c6 (diff) | |
download | golang-973d7ce551fafd0d5144cc5c4ada7826ca42275b.tar.gz |
net: fix netFD.Close races
Fixes issue 271.
Fixes issue 321.
R=rsc, agl, cw
CC=golang-dev
http://codereview.appspot.com/163052
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/net/sock.go')
-rw-r--r-- | src/pkg/net/sock.go | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/pkg/net/sock.go b/src/pkg/net/sock.go index c670aa21e..336c96866 100644 --- a/src/pkg/net/sock.go +++ b/src/pkg/net/sock.go @@ -75,11 +75,15 @@ func setsockoptNsec(fd, level, opt int, nsec int64) os.Error { } func setReadBuffer(fd *netFD, bytes int) os.Error { - return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes) + fd.incref(); + defer fd.decref(); + return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes); } func setWriteBuffer(fd *netFD, bytes int) os.Error { - return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes) + fd.incref(); + defer fd.decref(); + return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes); } func setReadTimeout(fd *netFD, nsec int64) os.Error { @@ -100,7 +104,9 @@ func setTimeout(fd *netFD, nsec int64) os.Error { } func setReuseAddr(fd *netFD, reuse bool) os.Error { - return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse)) + fd.incref(); + defer fd.decref(); + return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse)); } func bindToDevice(fd *netFD, dev string) os.Error { @@ -109,11 +115,15 @@ func bindToDevice(fd *netFD, dev string) os.Error { } func setDontRoute(fd *netFD, dontroute bool) os.Error { - return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute)) + fd.incref(); + defer fd.decref(); + return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute)); } func setKeepAlive(fd *netFD, keepalive bool) os.Error { - return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)) + fd.incref(); + defer fd.decref(); + return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)); } func setLinger(fd *netFD, sec int) os.Error { @@ -125,7 +135,9 @@ func setLinger(fd *netFD, sec int) os.Error { l.Onoff = 0; l.Linger = 0; } - e := syscall.SetsockoptLinger(fd.fd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l); + fd.incref(); + defer fd.decref(); + e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l); return os.NewSyscallError("setsockopt", e); } |