Rod Hynes 2 лет назад
Родитель
Сommit
2cbb12e591
2 измененных файлов с 11 добавлено и 6 удалено
  1. 4 0
      psiphon/common/quic/obfuscator.go
  2. 7 6
      psiphon/common/quic/quic.go

+ 4 - 0
psiphon/common/quic/obfuscator.go

@@ -253,6 +253,10 @@ func (conn *ObfuscatedPacketConn) Close() error {
 	}
 
 	if conn.isServer {
+
+		// Interrupt any blocked writes.
+		conn.PacketConn.SetWriteDeadline(time.Now())
+
 		close(conn.stopBroadcast)
 		conn.runWaitGroup.Wait()
 	}

+ 7 - 6
psiphon/common/quic/quic.go

@@ -172,14 +172,15 @@ func Listen(
 		return nil, errors.Trace(err)
 	}
 
-	// Ensure blocked packet writes eventually timeout. Note that quic-go
-	// manages read deadlines; we set only the write deadline here.
-	writeTimeoutUDPConn := &common.WriteTimeoutUDPConn{
-		UDPConn: udpConn,
-	}
+	// Note that WriteTimeoutUDPConn is not used here in the server case, as
+	// the server UDP conn will have many concurrent writers, and each
+	// SetWriteDeadline call by WriteTimeoutUDPConn would extend the deadline
+	// for all existing blocked writers. ObfuscatedPacketConn.Close calls
+	// SetWriteDeadline once to interrupt any blocked writers to ensure a
+	// timely shutdown.
 
 	obfuscatedPacketConn, err := NewServerObfuscatedPacketConn(
-		writeTimeoutUDPConn, true, false, false, obfuscationKey, seed)
+		udpConn, true, false, false, obfuscationKey, seed)
 	if err != nil {
 		udpConn.Close()
 		return nil, errors.Trace(err)