瀏覽代碼

#2605: Add safety check for type casting for QUIC dialer

Issue #2605 brought up real problem that QUIC dialer doesn't support sockopt at the moment. Inside `internet.DialSystem(...)` function, one of the branch that involves `redirect(...)` returns `cnc.connection` instance that is currently unhandled by the code logic, and thus caused program panic during runtime.

It seems the sockopt support for QUIC protocol requires a couple changes including making `cnc.connection` public, such that we can handle in dialer, along with some thorough tests, this commit simply adds safety check to explicity state the fact that QUIC isn't working with sockopt. And the implementation of the feature can be scheduled later on.
cty123 1 年之前
父節點
當前提交
f1c81557dc
共有 1 個文件被更改,包括 12 次插入3 次删除
  1. 12 3
      transport/internet/quic/dialer.go

+ 12 - 3
transport/internet/quic/dialer.go

@@ -146,10 +146,19 @@ func (s *clientConnections) openConnection(ctx context.Context, destAddr net.Add
 			return qlog.NewConnectionTracer(&QlogWriter{connID: ci}, p, ci)
 		},
 	}
-	udpConn, _ := rawConn.(*net.UDPConn)
-	if udpConn == nil {
-		udpConn = rawConn.(*internet.PacketConnWrapper).Conn.(*net.UDPConn)
+
+	var udpConn *net.UDPConn
+	switch conn := rawConn.(type) {
+	case *net.UDPConn:
+		udpConn = conn
+	case *internet.PacketConnWrapper:
+		udpConn = conn.Conn.(*net.UDPConn)
+	default:
+		// TODO: Support sockopt for QUIC
+		rawConn.Close()
+		return nil, newError("QUIC with sockopt is unsupported").AtWarning()
 	}
+
 	sysConn, err := wrapSysConn(udpConn, config)
 	if err != nil {
 		rawConn.Close()