From 7780db9bbec03440e55ff880d03c91455b6bac9f Mon Sep 17 00:00:00 2001 From: Esko Mobius Date: Mon, 28 Sep 2026 06:05:59 +0800 Subject: [PATCH] Finalmask: Fix panic when udpHop or xicmp fails; Restore udpHop's default `interval` (#6808) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/XTLS/Xray-core/pull/6808#pullrequestreview-5324529175 --------- Co-authored-by: 风扇滑翔翼 --- infra/conf/transport_finalmask.go | 11 +++++++++-- transport/internet/finalmask/finalmask.go | 9 +++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/infra/conf/transport_finalmask.go b/infra/conf/transport_finalmask.go index c46016584..62abf3893 100644 --- a/infra/conf/transport_finalmask.go +++ b/infra/conf/transport_finalmask.go @@ -942,12 +942,19 @@ func (c *UDPHop) Build() (proto.Message, error) { } return nil, errors.New("invalid ip ", ip) } + interval := c.Interval + if interval.From == 0 && interval.To == 0 { + interval.From, interval.To = 30, 30 + } + if interval.From < 5 { + return nil, errors.New("interval must be at least 5") + } return &udphop.Config{ Local: local, Remote: remote, RemoteOnce: remoteOnce, - IntervalMin: int64(c.Interval.From), - IntervalMax: int64(c.Interval.To), + IntervalMin: int64(interval.From), + IntervalMax: int64(interval.To), RemoteIPs: remoteIPs, RemotePorts: c.RemotePorts.Build().Ports(), }, nil diff --git a/transport/internet/finalmask/finalmask.go b/transport/internet/finalmask/finalmask.go index 179f958f0..199e24496 100644 --- a/transport/internet/finalmask/finalmask.go +++ b/transport/internet/finalmask/finalmask.go @@ -5,6 +5,7 @@ import ( "fmt" "slices" + "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/net" @@ -88,7 +89,7 @@ func (fm *FinalMask) DialTCP(ctx context.Context, dest net.Destination) (net.Con var newConn net.Conn newConn, err = fm.tcpMasks[i].WrapConnClient(conn, &dest, dialer) if err != nil { - _ = conn.Close() + common.CloseIfExists(conn) return nil, err } conn = newConn @@ -193,7 +194,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con } newConn, err = fm.udpMasks[i].WrapPacketConnClient(conn, &dest, dialer) if err != nil { - _ = conn.Close() + common.CloseIfExists(conn) return nil, err } conn = newConn @@ -240,7 +241,7 @@ func (fm *FinalMask) ListenPacket(ctx context.Context, addr net.Addr) (net.Packe if _, ok := fm.udpMasks[i].(interface{ HeaderConn() }); ok { newConn, err = fm.udpMasks[i].WrapPacketConnServer(nil, nil, nil) if err != nil { - _ = conn.Close() + common.CloseIfExists(conn) return nil, err } sizes = append(sizes, newConn.(interface{ Size() int }).Size()) @@ -253,7 +254,7 @@ func (fm *FinalMask) ListenPacket(ctx context.Context, addr net.Addr) (net.Packe } newConn, err = fm.udpMasks[i].WrapPacketConnServer(conn, addr, lc) if err != nil { - _ = conn.Close() + common.CloseIfExists(conn) return nil, err } conn = newConn