From 6af9a6207b47a2c0f8e446d17852bfc2ab2e2822 Mon Sep 17 00:00:00 2001 From: patterniha <71074308+patterniha@users.noreply.github.com> Date: Sat, 23 Aug 2025 06:05:28 +0330 Subject: [PATCH] fix memory leak --- app/dns/nameserver_udp.go | 4 +++- proxy/shadowsocks/server.go | 6 +++--- proxy/socks/server.go | 3 ++- proxy/trojan/protocol.go | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/dns/nameserver_udp.go b/app/dns/nameserver_udp.go index 3c25e612..066e6868 100644 --- a/app/dns/nameserver_udp.go +++ b/app/dns/nameserver_udp.go @@ -90,7 +90,9 @@ func (s *ClassicNameServer) RequestsCleanup() error { // HandleResponse handles udp response packet from remote DNS server. func (s *ClassicNameServer) HandleResponse(ctx context.Context, packet *udp_proto.Packet) { - ipRec, err := parseResponse(packet.Payload.Bytes()) + payload := packet.Payload + ipRec, err := parseResponse(payload.Bytes()) + payload.Release() if err != nil { errors.LogError(ctx, s.Name(), " fail to parse responded DNS udp") return diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index ec022084..360ea38c 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -104,12 +104,12 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dispatcher routing.Dispatcher) error { udpServer := udp.NewDispatcher(dispatcher, func(ctx context.Context, packet *udp_proto.Packet) { request := protocol.RequestHeaderFromContext(ctx) + payload := packet.Payload if request == nil { + payload.Release() return } - payload := packet.Payload - if payload.UDP != nil { request = &protocol.RequestHeader{ User: request.User, @@ -124,9 +124,9 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dis errors.LogWarningInner(ctx, err, "failed to encode UDP packet") return } - defer data.Release() conn.Write(data.Bytes()) + data.Release() }) defer udpServer.RemoveRay() diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 8a159fad..d4a9640a 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -231,6 +231,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dis request := protocol.RequestHeaderFromContext(ctx) if request == nil { + payload.Release() return } @@ -249,9 +250,9 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dis errors.LogWarningInner(ctx, err, "failed to write UDP response") return } - defer udpMessage.Release() conn.Write(udpMessage.Bytes()) + udpMessage.Release() }) defer udpServer.RemoveRay() diff --git a/proxy/trojan/protocol.go b/proxy/trojan/protocol.go index 96a16638..889ccc5c 100644 --- a/proxy/trojan/protocol.go +++ b/proxy/trojan/protocol.go @@ -113,9 +113,11 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { target = b.UDP } if _, err := w.writePacket(b.Bytes(), *target); err != nil { + b.Release() buf.ReleaseMulti(mb) return err } + b.Release() } return nil }