From 8ddd9085c16feac76f3d687324217043ecb76290 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, 16 Jul 2025 03:44:04 +0000 Subject: [PATCH] Fix 0 len outbounds --- proxy/freedom/freedom.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index df3efabe..6d8664a8 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -203,7 +203,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte writer = buf.NewWriter(conn) } } else { - writer = NewPacketWriter(conn, h, ctx, UDPOverride) + writer = NewPacketWriter(conn, h, ctx, UDPOverride, destination) if h.config.Noises != nil { errors.LogDebug(ctx, "NOISE", h.config.Noises) writer = &NoisePacketWriter{ @@ -318,7 +318,8 @@ func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { return buf.MultiBuffer{b}, nil } -func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride net.Destination) buf.Writer { +// DialDest means the dial target used in the dialer when creating conn +func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride net.Destination, DialDest net.Destination) buf.Writer { iConn := conn statConn, ok := iConn.(*stat.CounterConnection) if ok { @@ -329,14 +330,12 @@ func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride counter = statConn.WriteCounter } if c, ok := iConn.(*internet.PacketConnWrapper); ok { - // If target is a domain, it will be resolved in dialer + // If DialDest is a domain, it will be resolved in dialer // check this behavior and add it to map - outbounds := session.OutboundsFromContext(ctx) - targetAddr := outbounds[len(outbounds)-1].Target.Address resolvedUDPAddr := utils.NewTypedSyncMap[string, net.Address]() - if targetAddr.Family().IsDomain() { + if DialDest.Address.Family().IsDomain() { RemoteAddress, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) - resolvedUDPAddr.Store(targetAddr.String(), net.ParseAddress(RemoteAddress)) + resolvedUDPAddr.Store(DialDest.Address.String(), net.ParseAddress(RemoteAddress)) } return &PacketWriter{ PacketConnWrapper: c,