1
0
mirror of https://github.com/golang/go synced 2024-11-19 20:54:39 -07:00

net: fix race between Close and Read

Fixes #3507.

Applied the suggested fix from rsc. If the connection
is in closing state then errClosing will bubble up to
the caller.

The fix has been applied to udp, ip and unix as well as
their code path include nil'ing c.fd on close. Func
tests are available in the linked issue that verified
the bug existed there as well.

R=rsc, fullung, alex.brainman, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/6002053
This commit is contained in:
Dave Cheney 2012-04-21 10:01:32 +10:00
parent 904c7c8e99
commit 1f14d45e7d
4 changed files with 4 additions and 12 deletions

View File

@ -83,9 +83,7 @@ func (c *IPConn) Close() error {
if !c.ok() {
return syscall.EINVAL
}
err := c.fd.Close()
c.fd = nil
return err
return c.fd.Close()
}
// LocalAddr returns the local network address.

View File

@ -108,9 +108,7 @@ func (c *TCPConn) Close() error {
if !c.ok() {
return syscall.EINVAL
}
err := c.fd.Close()
c.fd = nil
return err
return c.fd.Close()
}
// CloseRead shuts down the reading side of the TCP connection.

View File

@ -88,9 +88,7 @@ func (c *UDPConn) Close() error {
if !c.ok() {
return syscall.EINVAL
}
err := c.fd.Close()
c.fd = nil
return err
return c.fd.Close()
}
// LocalAddr returns the local network address.

View File

@ -141,9 +141,7 @@ func (c *UnixConn) Close() error {
if !c.ok() {
return syscall.EINVAL
}
err := c.fd.Close()
c.fd = nil
return err
return c.fd.Close()
}
// LocalAddr returns the local network address, a *UnixAddr.