From b38a53e6299333e5999f661d7f73a51a2ab34b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Wed, 19 Feb 2025 19:31:29 +0800 Subject: [PATCH] UDS: Use UnixListenerWrapper & UnixConnWrapper (#4413) Fixes https://github.com/XTLS/Xray-core/issues/4411 --------- Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com> --- proxy/proxy.go | 4 ++-- transport/internet/system_listener.go | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/proxy/proxy.go b/proxy/proxy.go index 57649795..3fec31af 100644 --- a/proxy/proxy.go +++ b/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 diff --git a/transport/internet/system_listener.go b/transport/internet/system_listener.go index 1086aef5..fa3092a1 100644 --- a/transport/internet/system_listener.go +++ b/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 }