From eddad37c69114e5ca31564a3ba5b093781f78cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=96=D0=BE=D1=80=D0=B0=20=D0=97=D0=BC=D0=B5=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=D0=BD?= <48821354+Katze-942@users.noreply.github.com> Date: Mon, 5 Oct 2026 07:31:46 +0400 Subject: [PATCH] XDNS finalmask: Fix resolver close deadlock and socket leaks (#7089) https://github.com/XTLS/Xray-core/pull/7089#issuecomment-5987521972 --- transport/internet/finalmask/xdns/client.go | 3 +++ transport/internet/finalmask/xdns/resolver_tcp.go | 8 +++++--- transport/internet/finalmask/xdns/resolver_udp.go | 8 +++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/transport/internet/finalmask/xdns/client.go b/transport/internet/finalmask/xdns/client.go index b976f154f..d454a8ccd 100644 --- a/transport/internet/finalmask/xdns/client.go +++ b/transport/internet/finalmask/xdns/client.go @@ -80,6 +80,9 @@ func NewClient(c *Config, dialer *finalmask.Dialer) (net.PacketConn, error) { for i := range c.Resolvers { resolver, err := NewResolver(c.Resolvers[i], dialer) if err != nil { + for _, resolver := range resolvers { + resolver.Close() + } return nil, err } resolvers = append(resolvers, resolver) diff --git a/transport/internet/finalmask/xdns/resolver_tcp.go b/transport/internet/finalmask/xdns/resolver_tcp.go index 89f2b0ea6..0d0d2d845 100644 --- a/transport/internet/finalmask/xdns/resolver_tcp.go +++ b/transport/internet/finalmask/xdns/resolver_tcp.go @@ -130,13 +130,15 @@ func (r *TCPResolver) Send(p []byte) { func (r *TCPResolver) Close() { r.mu.Lock() - defer r.mu.Unlock() if r.closed() { + r.mu.Unlock() return } close(r.closeCh) - if r.conn != nil { - _ = r.conn.Close() + conn := r.conn + r.mu.Unlock() + if conn != nil { + _ = conn.Close() } r.wg.Wait() close(r.readCh) diff --git a/transport/internet/finalmask/xdns/resolver_udp.go b/transport/internet/finalmask/xdns/resolver_udp.go index e8d97ba29..43c35007c 100644 --- a/transport/internet/finalmask/xdns/resolver_udp.go +++ b/transport/internet/finalmask/xdns/resolver_udp.go @@ -117,13 +117,15 @@ func (r *UDPResolver) Send(p []byte) { func (r *UDPResolver) Close() { r.mu.Lock() - defer r.mu.Unlock() if r.closed() { + r.mu.Unlock() return } close(r.closeCh) - if r.conn != nil { - _ = r.conn.Close() + conn := r.conn + r.mu.Unlock() + if conn != nil { + _ = conn.Close() } r.wg.Wait() close(r.readCh)