Conn.Write should fail if Socket is destroyed

https://github.com/ipfs/go-ipfs/issues/2566
This commit is contained in:
Matt Joiner
2016-04-24 20:19:48 +10:00
parent 336395439c
commit 276b2e01aa
2 changed files with 26 additions and 3 deletions
+7 -3
View File
@@ -337,7 +337,7 @@ func (c *Conn) deliveryProcessor() {
func (c *Conn) lazyDestroy() {
if c.wroteFin && len(c.unackedSends) <= 1 && (c.gotFin || c.closed) {
c.destroy(nil)
c.destroy(errors.New("lazily destroyed"))
}
}
@@ -550,8 +550,12 @@ func (c *Conn) Write(p []byte) (n int, err error) {
defer mu.Unlock()
for len(p) != 0 {
for {
if c.wroteFin || c.gotFin {
err = io.ErrClosedPipe
if c.wroteFin || c.closed {
err = errClosed
return
}
if c.destroyed {
err = c.err
return
}
if c.connDeadlines.write.deadlineExceeded() {
+19
View File
@@ -571,3 +571,22 @@ func TestWriteClose(t *testing.T) {
require.EqualValues(t, "hiho", c)
b.Close()
}
func TestWriteUnderlyingPacketConnClosed(t *testing.T) {
// writeTimeout = time.Hour
// packetReadTimeout = time.Hour
pc, err := listenPacket("udp", "localhost:0")
require.NoError(t, err)
s, err := NewSocketFromPacketConn(pc)
require.NoError(t, err)
log.Println("pc closed")
dc, ac := connPairSocket(s)
defer dc.Close()
defer ac.Close()
pc.Close()
n, err := ac.Write([]byte("hello"))
require.Equal(t, 0, n)
require.EqualError(t, err, "error sending packet: closed")
_, err = dc.Read(nil)
require.EqualError(t, err, "Socket destroyed")
}