Ver código fonte

UDS: Use UnixListenerWrapper & UnixConnWrapper (#4413)

Fixes https://github.com/XTLS/Xray-core/issues/4411

---------

Co-authored-by: RPRX <[email protected]>
风扇滑翔翼 8 meses atrás
pai
commit
b38a53e629
2 arquivos alterados com 13 adições e 13 exclusões
  1. 2 2
      proxy/proxy.go
  2. 11 11
      transport/internet/system_listener.go

+ 2 - 2
proxy/proxy.go

@@ -547,8 +547,8 @@ func UnwrapRawConn(conn net.Conn) (net.Conn, stats.Counter, stats.Counter) {
 			conn = pc.Raw()
 			// 8192 > 4096, there is no need to process pc's bufReader
 		}
-		if uc, ok := conn.(*internet.UDSWrapperConn); ok {
-			conn = uc.Conn
+		if uc, ok := conn.(*internet.UnixConnWrapper); ok {
+			conn = uc.UnixConn
 		}
 	}
 	return conn, readCounter, writerCounter

+ 11 - 11
transport/internet/system_listener.go

@@ -44,32 +44,32 @@ func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []co
 // For some reason, other component of ray will assume the listener is a TCP listener and have valid remote address.
 // But in fact it doesn't. So we need to wrap the listener to make it return 0.0.0.0(unspecified) as remote address.
 // If other issues encountered, we should able to fix it here.
-type listenUDSWrapper struct {
-	net.Listener
+type UnixListenerWrapper struct {
+	*net.UnixListener
 	locker *FileLocker
 }
 
-func (l *listenUDSWrapper) Accept() (net.Conn, error) {
-	conn, err := l.Listener.Accept()
+func (l *UnixListenerWrapper) Accept() (net.Conn, error) {
+	conn, err := l.UnixListener.Accept()
 	if err != nil {
 		return nil, err
 	}
-	return &UDSWrapperConn{Conn: conn}, nil
+	return &UnixConnWrapper{UnixConn: conn.(*net.UnixConn)}, nil
 }
 
-func (l *listenUDSWrapper) Close() error {
+func (l *UnixListenerWrapper) Close() error {
 	if l.locker != nil {
 		l.locker.Release()
 		l.locker = nil
 	}
-	return l.Listener.Close()
+	return l.UnixListener.Close()
 }
 
-type UDSWrapperConn struct {
-	net.Conn
+type UnixConnWrapper struct {
+	*net.UnixConn
 }
 
-func (conn *UDSWrapperConn) RemoteAddr() net.Addr {
+func (conn *UnixConnWrapper) RemoteAddr() net.Addr {
 	return &net.TCPAddr{
 		IP: []byte{0, 0, 0, 0},
 	}
@@ -136,7 +136,7 @@ func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *S
 					locker.Release()
 					return nil, err
 				}
-				l = &listenUDSWrapper{Listener: l, locker: locker}
+				l = &UnixListenerWrapper{UnixListener: l.(*net.UnixListener), locker: locker}
 				if filePerm == nil {
 					return l, nil
 				}