瀏覽代碼

Don't potentially block forever in Close() (fixes #655)

Jakob Borg 11 年之前
父節點
當前提交
5d85a24977
共有 1 個文件被更改,包括 8 次插入0 次删除
  1. 8 0
      model/model.go

+ 8 - 0
model/model.go

@@ -5,6 +5,7 @@
 package model
 
 import (
+	"crypto/tls"
 	"errors"
 	"fmt"
 	"io"
@@ -474,6 +475,13 @@ func (m *Model) Close(node protocol.NodeID, err error) {
 
 	conn, ok := m.rawConn[node]
 	if ok {
+		if conn, ok := conn.(*tls.Conn); ok {
+			// If the underlying connection is a *tls.Conn, Close() does more
+			// than it says on the tin. Specifically, it sends a TLS alert
+			// message, which might block forever if the connection is dead
+			// and we don't have a deadline site.
+			conn.SetWriteDeadline(time.Now().Add(250 * time.Millisecond))
+		}
 		conn.Close()
 	}
 	delete(m.protoConn, node)