From fd850d00e5cd5351430b28d1e3c457bbb2d2c772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 3 Jul 2023 21:18:10 +0800 Subject: [PATCH] Fix buffer usage --- go.mod | 2 +- go.sum | 4 ++-- lwip.go | 11 +++-------- system.go | 14 +++++--------- tun_darwin_gvisor.go | 20 +++++++------------- 5 files changed, 18 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 61e776f..75b2b12 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 github.com/sagernet/gvisor v0.0.0-20230627031050-1ab0276e0dd2 github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 - github.com/sagernet/sing v0.2.7 + github.com/sagernet/sing v0.2.8-0.20230703002104-c68251b6d059 github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 golang.org/x/net v0.11.0 golang.org/x/sys v0.9.0 diff --git a/go.sum b/go.sum index b8062d8..43e96a7 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,8 @@ github.com/sagernet/gvisor v0.0.0-20230627031050-1ab0276e0dd2/go.mod h1:1JUiV7nG github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 h1:iL5gZI3uFp0X6EslacyapiRz7LLSJyr4RajF/BhMVyE= github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/sing v0.0.0-20220817130738-ce854cda8522/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= -github.com/sagernet/sing v0.2.7 h1:cOy0FfPS8q7m0aJ51wS7LRQAGc9wF+fWhHtBDj99wy8= -github.com/sagernet/sing v0.2.7/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= +github.com/sagernet/sing v0.2.8-0.20230703002104-c68251b6d059 h1:nqTONy58Gq1mdoGx9GX+GKXdSTwOPTKF/DXK+Wn4B+A= +github.com/sagernet/sing v0.2.8-0.20230703002104-c68251b6d059/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 h1:rc/CcqLH3lh8n+csdOuDfP+NuykE0U6AeYSJJHKDgSg= github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9/go.mod h1:a/83NAfUXvEuLpmxDssAXxgUgrEy12MId3Wd7OTs76s= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= diff --git a/lwip.go b/lwip.go index 7a37c3a..1b52bed 100644 --- a/lwip.go +++ b/lwip.go @@ -52,18 +52,13 @@ func (l *LWIP) loopIn() { l.loopInWintun(winTun) return } - mtu := int(l.tunMtu) + PacketOffset - _buffer := buf.StackNewSize(mtu) - defer common.KeepAlive(_buffer) - buffer := common.Dup(_buffer) - defer buffer.Release() - data := buffer.FreeBytes() + buffer := make([]byte, int(l.tunMtu) + PacketOffset) for { - n, err := l.tun.Read(data) + n, err := l.tun.Read(buffer) if err != nil { return } - _, err = l.stack.Write(data[PacketOffset:n]) + _, err = l.stack.Write(buffer[PacketOffset:n]) if err != nil { if err.Error() == "stack closed" { return diff --git a/system.go b/system.go index 5cf2dc5..48699a6 100644 --- a/system.go +++ b/system.go @@ -134,20 +134,16 @@ func (s *System) tunLoop() { s.wintunLoop(winTun) return } - _packetBuffer := buf.StackNewSize(int(s.mtu)) - defer common.KeepAlive(_packetBuffer) - packetBuffer := common.Dup(_packetBuffer) - defer packetBuffer.Release() - packetSlice := packetBuffer.Slice() + packetBuffer := make([]byte, s.mtu + PacketOffset) for { - n, err := s.tun.Read(packetSlice) + n, err := s.tun.Read(packetBuffer) if err != nil { return } if n < clashtcpip.IPv4PacketMinLength { continue } - packet := packetSlice[PacketOffset:n] + packet := packetBuffer[PacketOffset:n] switch ipVersion := packet[0] >> 4; ipVersion { case 4: err = s.processIPv4(packet) @@ -475,7 +471,7 @@ type systemUDPPacketWriter4 struct { } func (w *systemUDPPacketWriter4) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error { - newPacket := buf.StackNewSize(len(w.header) + buffer.Len()) + newPacket := buf.NewSize(len(w.header) + buffer.Len()) defer newPacket.Release() newPacket.Write(w.header) newPacket.Write(buffer.Bytes()) @@ -499,7 +495,7 @@ type systemUDPPacketWriter6 struct { } func (w *systemUDPPacketWriter6) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error { - newPacket := buf.StackNewSize(len(w.header) + buffer.Len()) + newPacket := buf.NewSize(len(w.header) + buffer.Len()) defer newPacket.Release() newPacket.Write(w.header) newPacket.Write(buffer.Bytes()) diff --git a/tun_darwin_gvisor.go b/tun_darwin_gvisor.go index fb5538c..6a9c784 100644 --- a/tun_darwin_gvisor.go +++ b/tun_darwin_gvisor.go @@ -7,8 +7,6 @@ import ( "github.com/sagernet/gvisor/pkg/tcpip" "github.com/sagernet/gvisor/pkg/tcpip/header" "github.com/sagernet/gvisor/pkg/tcpip/stack" - "github.com/sagernet/sing/common" - "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" ) @@ -53,37 +51,33 @@ func (e *DarwinEndpoint) Attach(dispatcher stack.NetworkDispatcher) { } func (e *DarwinEndpoint) dispatchLoop() { - _buffer := buf.StackNewSize(int(e.tun.mtu) + 4) - defer common.KeepAlive(_buffer) - packetBuffer := common.Dup(_buffer) - defer packetBuffer.Release() - data := packetBuffer.FreeBytes() + packetBuffer := make([]byte, e.tun.mtu + 4) for { - n, err := e.tun.tunFile.Read(data) + n, err := e.tun.tunFile.Read(packetBuffer) if err != nil { break } - packet := data[4:n] + packet := packetBuffer[4:n] var networkProtocol tcpip.NetworkProtocolNumber switch header.IPVersion(packet) { case header.IPv4Version: networkProtocol = header.IPv4ProtocolNumber if header.IPv4(packet).DestinationAddress().As4() == e.tun.inet4Address { - e.tun.tunFile.Write(data[:n]) + e.tun.tunFile.Write(packetBuffer[:n]) continue } case header.IPv6Version: networkProtocol = header.IPv6ProtocolNumber if header.IPv6(packet).DestinationAddress().As16() == e.tun.inet6Address { - e.tun.tunFile.Write(data[:n]) + e.tun.tunFile.Write(packetBuffer[:n]) continue } default: - e.tun.tunFile.Write(data[:n]) + e.tun.tunFile.Write(packetBuffer[:n]) continue } pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{ - Payload: buffer.MakeWithData(data[4:n]), + Payload: buffer.MakeWithData(packetBuffer[4:n]), IsForwardedPacket: true, }) pkt.NetworkProtocolNumber = networkProtocol