From 5c3d639c09f49318e844fd1c6f364e7c21e1a536 Mon Sep 17 00:00:00 2001 From: LjhAUMEM Date: Wed, 15 Apr 2026 20:11:51 +0800 Subject: [PATCH] Chore: Use buf.NewWithSize() (#5941) --- proxy/hysteria/client.go | 5 ++-- proxy/tun/stack_gvisor.go | 3 +-- proxy/tun/udp_fullcone.go | 29 +++++++------------- proxy/wireguard/tun.go | 32 ++++++++--------------- transport/internet/finalmask/finalmask.go | 18 ++++++++----- 5 files changed, 37 insertions(+), 50 deletions(-) diff --git a/proxy/hysteria/client.go b/proxy/hysteria/client.go index 1dcb5cf9..7c2bc58d 100644 --- a/proxy/hysteria/client.go +++ b/proxy/hysteria/client.go @@ -244,11 +244,12 @@ type UDPReader struct { func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { if r.firstMsg != nil { - buffer := buf.New() + buffer := buf.NewWithSize(int32(len(r.firstMsg.Data))) buffer.Write(r.firstMsg.Data) buffer.UDP = r.firstDest r.firstMsg = nil + r.firstDest = nil return buf.MultiBuffer{buffer}, nil } @@ -274,7 +275,7 @@ func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { continue } - buffer := buf.New() + buffer := buf.NewWithSize(int32(len(dfMsg.Data))) buffer.Write(dfMsg.Data) buffer.UDP = &dest diff --git a/proxy/tun/stack_gvisor.go b/proxy/tun/stack_gvisor.go index 0e9db8ff..b8ee3591 100644 --- a/proxy/tun/stack_gvisor.go +++ b/proxy/tun/stack_gvisor.go @@ -110,8 +110,7 @@ func (t *stackGVisor) Start() error { srcIP := net.IPAddress(id.RemoteAddress.AsSlice()) dstIP := net.IPAddress(id.LocalAddress.AsSlice()) if srcIP == nil || dstIP == nil { - errors.LogDebug(context.Background(), "drop udp with size ", len(data), " > invalid ip address ", id.RemoteAddress.AsSlice(), " ", id.LocalAddress.AsSlice()) - return true + panic(id) } src := net.UDPDestination(srcIP, net.Port(id.RemotePort)) dst := net.UDPDestination(dstIP, net.Port(id.LocalPort)) diff --git a/proxy/tun/udp_fullcone.go b/proxy/tun/udp_fullcone.go index 44612100..fdec7bf6 100644 --- a/proxy/tun/udp_fullcone.go +++ b/proxy/tun/udp_fullcone.go @@ -74,7 +74,7 @@ func (u *udpConnectionHandler) HandlePacket(src net.Destination, dst net.Destina dest: &dst, }: default: - errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", conn.dst.NetAddr(), " > queue full") + errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", conn.dst.NetAddr(), " > queue full 2") } } @@ -98,25 +98,16 @@ type udpConn struct { } func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) { - for { - e, ok := <-c.egress - if !ok { - return nil, io.EOF - } - - b := buf.New() - - _, err := b.Write(e.data) - if err != nil { - errors.LogDebugInner(context.Background(), err, "drop udp with size ", len(e.data), " to ", e.dest.NetAddr(), " original ", c.dst.NetAddr()) - b.Release() - continue - } - - b.UDP = e.dest - - return buf.MultiBuffer{b}, nil + e, ok := <-c.egress + if !ok { + return nil, io.EOF } + + b := buf.NewWithSize(int32(len(e.data))) + b.Write(e.data) + b.UDP = e.dest + + return buf.MultiBuffer{b}, nil } // Read packets from the connection diff --git a/proxy/wireguard/tun.go b/proxy/wireguard/tun.go index 86ff9f45..6decfa70 100644 --- a/proxy/wireguard/tun.go +++ b/proxy/wireguard/tun.go @@ -192,8 +192,7 @@ func createGVisorTun(localAddresses []netip.Addr, mtu int, handler promiscuousMo srcIP := net.IPAddress(id.RemoteAddress.AsSlice()) dstIP := net.IPAddress(id.LocalAddress.AsSlice()) if srcIP == nil || dstIP == nil { - errors.LogDebug(context.Background(), "drop udp with size ", len(data), " > invalid ip address ", id.RemoteAddress.AsSlice(), " ", id.LocalAddress.AsSlice()) - return true + panic(id) } src := net.UDPDestination(srcIP, net.Port(id.RemotePort)) dst := net.UDPDestination(dstIP, net.Port(id.LocalPort)) @@ -256,7 +255,7 @@ func (m *udpManager) feed(src net.Destination, dst net.Destination, data []byte) dest: &dst, }: default: - errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", uc.dst.NetAddr(), " > queue full") + errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", uc.dst.NetAddr(), " > queue full 2") } } @@ -346,25 +345,16 @@ type udpConn struct { } func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) { - for { - q, ok := <-c.queue - if !ok { - return nil, io.EOF - } - - b := buf.New() - - _, err := b.Write(q.p) - if err != nil { - errors.LogDebugInner(context.Background(), err, "drop udp with size ", len(q.p), " to ", q.dest.NetAddr(), " original ", c.dst.NetAddr()) - b.Release() - continue - } - - b.UDP = q.dest - - return buf.MultiBuffer{b}, nil + q, ok := <-c.queue + if !ok { + return nil, io.EOF } + + b := buf.NewWithSize(int32(len(q.p))) + b.Write(q.p) + b.UDP = q.dest + + return buf.MultiBuffer{b}, nil } func (c *udpConn) Read(p []byte) (int, error) { diff --git a/transport/internet/finalmask/finalmask.go b/transport/internet/finalmask/finalmask.go index a98aa3fc..5ef25064 100644 --- a/transport/internet/finalmask/finalmask.go +++ b/transport/internet/finalmask/finalmask.go @@ -5,6 +5,7 @@ import ( "net" "sync" + xbuf "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/errors" ) @@ -104,17 +105,22 @@ type headerSize interface { } type headerManagerConn struct { - sizes []int - conns []net.PacketConn + sync.Mutex net.PacketConn - m sync.Mutex + + sizes []int + conns []net.PacketConn writeBuf [UDPSize]byte } func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { buf := p if len(buf) < UDPSize { - buf = make([]byte, UDPSize) + b := xbuf.NewWithSize(UDPSize) + defer b.Release() + b.Resize(0, UDPSize) + + buf = b.Bytes() } n, addr, err = c.PacketConn.ReadFrom(buf) @@ -153,8 +159,8 @@ func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) } func (c *headerManagerConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.m.Lock() - defer c.m.Unlock() + c.Lock() + defer c.Unlock() sum := 0 for _, size := range c.sizes {