From 81d32181ce407027d844841c7c2d962ea868cb28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 20 May 2025 18:17:20 +0800 Subject: [PATCH 01/14] Fix update route address set --- protocol/tun/inbound.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/protocol/tun/inbound.go b/protocol/tun/inbound.go index 70f78c0a..ff026553 100644 --- a/protocol/tun/inbound.go +++ b/protocol/tun/inbound.go @@ -214,7 +214,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo if !loaded { return nil, E.New("parse route_address_set: rule-set not found: ", routeAddressSet) } - ruleSet.IncRef() inbound.routeRuleSet = append(inbound.routeRuleSet, ruleSet) } for _, routeExcludeAddressSet := range options.RouteExcludeAddressSet { @@ -222,7 +221,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo if !loaded { return nil, E.New("parse route_exclude_address_set: rule-set not found: ", routeExcludeAddressSet) } - ruleSet.IncRef() inbound.routeExcludeRuleSet = append(inbound.routeExcludeRuleSet, ruleSet) } if options.AutoRedirect { @@ -312,7 +310,7 @@ func (t *Inbound) Start(stage adapter.StartStage) error { if len(ipSets) == 0 { t.logger.Warn("route_address_set: no destination IP CIDR rules found in rule-set: ", routeRuleSet.Name()) } - routeRuleSet.DecRef() + routeRuleSet.IncRef() t.routeAddressSet = append(t.routeAddressSet, ipSets...) if t.autoRedirect != nil { t.routeRuleSetCallback = append(t.routeRuleSetCallback, routeRuleSet.RegisterCallback(t.updateRouteAddressSet)) @@ -324,7 +322,7 @@ func (t *Inbound) Start(stage adapter.StartStage) error { if len(ipSets) == 0 { t.logger.Warn("route_address_set: no destination IP CIDR rules found in rule-set: ", routeExcludeRuleSet.Name()) } - routeExcludeRuleSet.DecRef() + routeExcludeRuleSet.IncRef() t.routeExcludeAddressSet = append(t.routeExcludeAddressSet, ipSets...) if t.autoRedirect != nil { t.routeExcludeRuleSetCallback = append(t.routeExcludeRuleSetCallback, routeExcludeRuleSet.RegisterCallback(t.updateRouteAddressSet)) From 41226a60755c944486941538d2c36cab9b78bed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Fri, 23 May 2025 10:56:35 +0800 Subject: [PATCH 02/14] Fix interface finder --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 3ace9231..628bfba0 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff github.com/sagernet/quic-go v0.49.0-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 - github.com/sagernet/sing v0.6.9 + github.com/sagernet/sing v0.6.10 github.com/sagernet/sing-dns v0.4.3 github.com/sagernet/sing-mux v0.3.2 github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 diff --git a/go.sum b/go.sum index 8e23f50a..7d4c0ccf 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,9 @@ github.com/sagernet/quic-go v0.49.0-beta.1 h1:3LdoCzVVfYRibZns1tYWSIoB65fpTmrwy+ github.com/sagernet/quic-go v0.49.0-beta.1/go.mod h1:uesWD1Ihrldq1M3XtjuEvIUqi8WHNsRs71b3Lt1+p/U= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= -github.com/sagernet/sing v0.6.9 h1:y/XJH17oyBd6hxgQtKnIdLXu7TsOHxO5i1JeVfVmjXw= github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= +github.com/sagernet/sing v0.6.10 h1:Jey1tePgH9bjFuK1fQI3D9T+bPOQ4SdHMjuS4sYjDv4= +github.com/sagernet/sing v0.6.10/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing-dns v0.4.3 h1:R6X9oWYbdZ0Mm+8PkdqrBkqx3JwiAbnETUZGOpEdY4E= github.com/sagernet/sing-dns v0.4.3/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8= github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/NE= From 995267a04286ed32fe18aa6fe6b150749d1a76dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 24 May 2025 07:41:51 +0800 Subject: [PATCH 03/14] Remove wrong ALPNs in DOH/DOH3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 628bfba0..53932f00 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/sagernet/quic-go v0.49.0-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 github.com/sagernet/sing v0.6.10 - github.com/sagernet/sing-dns v0.4.3 + github.com/sagernet/sing-dns v0.4.5 github.com/sagernet/sing-mux v0.3.2 github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 github.com/sagernet/sing-shadowsocks v0.2.7 diff --git a/go.sum b/go.sum index 7d4c0ccf..a681c992 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4Wk github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing v0.6.10 h1:Jey1tePgH9bjFuK1fQI3D9T+bPOQ4SdHMjuS4sYjDv4= github.com/sagernet/sing v0.6.10/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing-dns v0.4.3 h1:R6X9oWYbdZ0Mm+8PkdqrBkqx3JwiAbnETUZGOpEdY4E= -github.com/sagernet/sing-dns v0.4.3/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8= +github.com/sagernet/sing-dns v0.4.5 h1:D9REN14qx2FTrZRBrtFLL99f2CuFzQ9S7mIf8uV5hZI= +github.com/sagernet/sing-dns v0.4.5/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8= github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/NE= github.com/sagernet/sing-mux v0.3.2/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA= github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 h1:iwpCX6H3nZEOGUGwx0q5azcgYOA9f6v9YssihXoRKHk= From bc5eb1e1a58ce4870e0ee4d583669625dc3d95aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 24 May 2025 08:14:43 +0800 Subject: [PATCH 04/14] Fix RoutePacketConnectionEx --- route/route.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/route/route.go b/route/route.go index f3e7a983..f354095d 100644 --- a/route/route.go +++ b/route/route.go @@ -176,8 +176,6 @@ func (r *Router) RoutePacketConnectionEx(ctx context.Context, conn N.PacketConn, } else { r.logger.ErrorContext(ctx, err) } - } else if onClose != nil { - onClose(nil) } } From 50227c0f5fc8682cc27895e9eda7840234e399d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 26 May 2025 17:51:32 +0800 Subject: [PATCH 05/14] Fix sniff action --- route/route.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/route/route.go b/route/route.go index f354095d..d0f93e0b 100644 --- a/route/route.go +++ b/route/route.go @@ -496,7 +496,9 @@ func (r *Router) actionSniff( return } if inputConn != nil { - sniffBuffer := buf.NewPacket() + if len(action.StreamSniffers) == 0 && len(action.PacketSniffers) > 0 { + return + } var streamSniffers []sniff.StreamSniffer if len(action.StreamSniffers) > 0 { streamSniffers = action.StreamSniffers @@ -510,6 +512,7 @@ func (r *Router) actionSniff( sniff.RDP, } } + sniffBuffer := buf.NewPacket() err := sniff.PeekStream( ctx, metadata, @@ -541,10 +544,25 @@ func (r *Router) actionSniff( sniffBuffer.Release() } } else if inputPacketConn != nil { - if metadata.PacketSniffError != nil && !errors.Is(metadata.PacketSniffError, sniff.ErrNeedMoreData) { + if len(action.PacketSniffers) == 0 && len(action.StreamSniffers) > 0 { + return + } else if metadata.PacketSniffError != nil && !errors.Is(metadata.PacketSniffError, sniff.ErrNeedMoreData) { r.logger.DebugContext(ctx, "packet sniff skipped due to previous error: ", metadata.PacketSniffError) return } + var packetSniffers []sniff.PacketSniffer + if len(action.PacketSniffers) > 0 { + packetSniffers = action.PacketSniffers + } else { + packetSniffers = []sniff.PacketSniffer{ + sniff.DomainNameQuery, + sniff.QUICClientHello, + sniff.STUNMessage, + sniff.UTP, + sniff.UDPTracker, + sniff.DTLSRecord, + } + } for { var ( sniffBuffer = buf.NewPacket() @@ -584,19 +602,6 @@ func (r *Router) actionSniff( sniff.QUICClientHello, ) } else { - var packetSniffers []sniff.PacketSniffer - if len(action.PacketSniffers) > 0 { - packetSniffers = action.PacketSniffers - } else { - packetSniffers = []sniff.PacketSniffer{ - sniff.DomainNameQuery, - sniff.QUICClientHello, - sniff.STUNMessage, - sniff.UTP, - sniff.UDPTracker, - sniff.DTLSRecord, - } - } err = sniff.PeekPacket( ctx, metadata, sniffBuffer.Bytes(), From ee3a42a67ea5cceec1aca5dc9699e08f664e1746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 26 May 2025 18:09:32 +0800 Subject: [PATCH 06/14] Fix none method read buffer --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 53932f00..83eb81b0 100644 --- a/go.mod +++ b/go.mod @@ -30,8 +30,8 @@ require ( github.com/sagernet/sing-dns v0.4.5 github.com/sagernet/sing-mux v0.3.2 github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 - github.com/sagernet/sing-shadowsocks v0.2.7 - github.com/sagernet/sing-shadowsocks2 v0.2.0 + github.com/sagernet/sing-shadowsocks v0.2.8 + github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/sagernet/sing-shadowtls v0.2.0 github.com/sagernet/sing-tun v0.6.5 github.com/sagernet/sing-vmess v0.2.1 diff --git a/go.sum b/go.sum index a681c992..cdfbed2a 100644 --- a/go.sum +++ b/go.sum @@ -127,10 +127,10 @@ github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/ github.com/sagernet/sing-mux v0.3.2/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA= github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 h1:iwpCX6H3nZEOGUGwx0q5azcgYOA9f6v9YssihXoRKHk= github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76/go.mod h1:tqPa0/Wqa19MkkSlKVZZX5sHxtiDR9BROcn4ufcbVdY= -github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8= -github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE= -github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg= -github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= +github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE= +github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI= +github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo= +github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.2.0 h1:cLKe4OAOFwuhmAIuPLj//CIL7Q9js+pIDardhJ+/osk= github.com/sagernet/sing-shadowtls v0.2.0/go.mod h1:agU+Fw5X+xnWVyRHyFthoZCX3MfWKCFPm4JUf+1oaxo= github.com/sagernet/sing-tun v0.6.5 h1:nGfD6GNq/r0tEjdZHOV3BS6fydSmd4kBAokU5rffssg= From e7b3a8eebe15ec223ec978bef84e067efecdbc99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 3 May 2025 11:35:53 +0800 Subject: [PATCH 07/14] Fix vmess read request --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 83eb81b0..688968c0 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/sagernet/sing-shadowtls v0.2.0 github.com/sagernet/sing-tun v0.6.5 - github.com/sagernet/sing-vmess v0.2.1 + github.com/sagernet/sing-vmess v0.2.3 github.com/sagernet/smux v1.5.34-mod.2 github.com/sagernet/utls v1.6.7 github.com/sagernet/wireguard-go v0.0.1-beta.7 diff --git a/go.sum b/go.sum index cdfbed2a..6382e329 100644 --- a/go.sum +++ b/go.sum @@ -137,6 +137,8 @@ github.com/sagernet/sing-tun v0.6.5 h1:nGfD6GNq/r0tEjdZHOV3BS6fydSmd4kBAokU5rffs github.com/sagernet/sing-tun v0.6.5/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE= github.com/sagernet/sing-vmess v0.2.1 h1:6izHC2+B68aQCxTagki6eZZc+g5eh4dYwxOV5a2Lhug= github.com/sagernet/sing-vmess v0.2.1/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA= +github.com/sagernet/sing-vmess v0.2.3 h1:z6Ym8dnZG7k1fP3+54vz8G0tvRVJeOoTFFeUPwXTD44= +github.com/sagernet/sing-vmess v0.2.3/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA= github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4= github.com/sagernet/smux v1.5.34-mod.2/go.mod h1:0KW0+R+ycvA2INW4gbsd7BNyg+HEfLIAxa5N02/28Zc= github.com/sagernet/utls v1.6.7 h1:Ep3+aJ8FUGGta+II2IEVNUc3EDhaRCZINWkj/LloIA8= From 83cf5f5c6abcc43877eb012bdac9ebef2c08f3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 27 May 2025 14:29:44 +0800 Subject: [PATCH 08/14] Fix ws closed error message --- transport/v2raywebsocket/conn.go | 43 ++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/transport/v2raywebsocket/conn.go b/transport/v2raywebsocket/conn.go index f9099764..a796e612 100644 --- a/transport/v2raywebsocket/conn.go +++ b/transport/v2raywebsocket/conn.go @@ -3,6 +3,7 @@ package v2raywebsocket import ( "context" "encoding/base64" + "errors" "io" "net" "os" @@ -61,7 +62,7 @@ func (c *WebsocketConn) Close() error { func (c *WebsocketConn) Read(b []byte) (n int, err error) { var header ws.Header for { - n, err = c.reader.Read(b) + n, err = wrapWsError0(c.reader.Read(b)) if n > 0 { err = nil return @@ -95,7 +96,7 @@ func (c *WebsocketConn) Read(b []byte) (n int, err error) { } func (c *WebsocketConn) Write(p []byte) (n int, err error) { - err = wsutil.WriteMessage(c.Conn, c.state, ws.OpBinary, p) + err = wrapWsError(wsutil.WriteMessage(c.Conn, c.state, ws.OpBinary, p)) if err != nil { return } @@ -146,7 +147,7 @@ func (c *EarlyWebsocketConn) Read(b []byte) (n int, err error) { return 0, c.err } } - return c.conn.Read(b) + return wrapWsError0(c.conn.Read(b)) } func (c *EarlyWebsocketConn) writeRequest(content []byte) error { @@ -177,12 +178,12 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error { conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers) } if err != nil { - return err + return wrapWsError(err) } if len(lateData) > 0 { _, err = conn.Write(lateData) if err != nil { - return err + return wrapWsError(err) } } c.conn = conn @@ -191,7 +192,7 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error { func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) { if c.conn != nil { - return c.conn.Write(b) + return wrapWsError0(c.conn.Write(b)) } c.access.Lock() defer c.access.Unlock() @@ -199,9 +200,9 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) { return 0, c.err } if c.conn != nil { - return c.conn.Write(b) + return wrapWsError0(c.conn.Write(b)) } - err = c.writeRequest(b) + err = wrapWsError(c.writeRequest(b)) c.err = err close(c.create) if err != nil { @@ -212,17 +213,17 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) { func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error { if c.conn != nil { - return c.conn.WriteBuffer(buffer) + return wrapWsError(c.conn.WriteBuffer(buffer)) } c.access.Lock() defer c.access.Unlock() if c.conn != nil { - return c.conn.WriteBuffer(buffer) + return wrapWsError(c.conn.WriteBuffer(buffer)) } if c.err != nil { return c.err } - err := c.writeRequest(buffer.Bytes()) + err := wrapWsError(c.writeRequest(buffer.Bytes())) c.err = err close(c.create) return err @@ -272,3 +273,23 @@ func (c *EarlyWebsocketConn) Upstream() any { func (c *EarlyWebsocketConn) LazyHeadroom() bool { return c.conn == nil } + +func wrapWsError(err error) error { + if err == nil { + return nil + } + var closedErr *wsutil.ClosedError + if errors.As(err, &closedErr) { + if closedErr.Code == ws.StatusNormalClosure { + err = io.EOF + } + } + return err +} + +func wrapWsError0[T any](value T, err error) (T, error) { + if err == nil { + return value, nil + } + return common.DefaultValue[T](), wrapWsError(err) +} From b4d294c05e22bfcfb9b35a7001a732adf09c29aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Wed, 4 Jun 2025 20:03:45 +0800 Subject: [PATCH 09/14] Fix TUIC read buffer --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 688968c0..f44affae 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/sagernet/sing v0.6.10 github.com/sagernet/sing-dns v0.4.5 github.com/sagernet/sing-mux v0.3.2 - github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 + github.com/sagernet/sing-quic v0.4.3 github.com/sagernet/sing-shadowsocks v0.2.8 github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/sagernet/sing-shadowtls v0.2.0 diff --git a/go.sum b/go.sum index 6382e329..8d01ac3b 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/sagernet/sing-dns v0.4.5 h1:D9REN14qx2FTrZRBrtFLL99f2CuFzQ9S7mIf8uV5h github.com/sagernet/sing-dns v0.4.5/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8= github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/NE= github.com/sagernet/sing-mux v0.3.2/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA= -github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76 h1:iwpCX6H3nZEOGUGwx0q5azcgYOA9f6v9YssihXoRKHk= -github.com/sagernet/sing-quic v0.4.1-0.20250423030647-0eb05f373a76/go.mod h1:tqPa0/Wqa19MkkSlKVZZX5sHxtiDR9BROcn4ufcbVdY= +github.com/sagernet/sing-quic v0.4.3 h1:OZ/kGvSzjtYg+t0DY3F606hlT5LeiQQXDxfBopcRryQ= +github.com/sagernet/sing-quic v0.4.3/go.mod h1:tqPa0/Wqa19MkkSlKVZZX5sHxtiDR9BROcn4ufcbVdY= github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE= github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI= github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo= @@ -135,8 +135,6 @@ github.com/sagernet/sing-shadowtls v0.2.0 h1:cLKe4OAOFwuhmAIuPLj//CIL7Q9js+pIDar github.com/sagernet/sing-shadowtls v0.2.0/go.mod h1:agU+Fw5X+xnWVyRHyFthoZCX3MfWKCFPm4JUf+1oaxo= github.com/sagernet/sing-tun v0.6.5 h1:nGfD6GNq/r0tEjdZHOV3BS6fydSmd4kBAokU5rffssg= github.com/sagernet/sing-tun v0.6.5/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE= -github.com/sagernet/sing-vmess v0.2.1 h1:6izHC2+B68aQCxTagki6eZZc+g5eh4dYwxOV5a2Lhug= -github.com/sagernet/sing-vmess v0.2.1/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA= github.com/sagernet/sing-vmess v0.2.3 h1:z6Ym8dnZG7k1fP3+54vz8G0tvRVJeOoTFFeUPwXTD44= github.com/sagernet/sing-vmess v0.2.3/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA= github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4= From 3ea5f764707897360d41f763bd0347dacf23322b Mon Sep 17 00:00:00 2001 From: Mahdi <80265960+Mahdi-zarei@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:35:30 +0330 Subject: [PATCH 10/14] Fix nil logger at v2rayhttp server --- transport/v2rayhttp/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/transport/v2rayhttp/server.go b/transport/v2rayhttp/server.go index dd2bc9a2..c74e59aa 100644 --- a/transport/v2rayhttp/server.go +++ b/transport/v2rayhttp/server.go @@ -47,6 +47,7 @@ func NewServer(ctx context.Context, logger logger.ContextLogger, options option. server := &Server{ ctx: ctx, tlsConfig: tlsConfig, + logger: logger, handler: handler, h2Server: &http2.Server{ IdleTimeout: time.Duration(options.IdleTimeout), From 78ae935468bb395777de48642d505a97be62a29e Mon Sep 17 00:00:00 2001 From: Sentsuki <52487960+Sentsuki@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:04:39 +0800 Subject: [PATCH 11/14] documentation: Fix typo Signed-off-by: Sentsuki <52487960+Sentsuki@users.noreply.github.com> --- docs/configuration/inbound/tun.zh.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/configuration/inbound/tun.zh.md b/docs/configuration/inbound/tun.zh.md index b3b561f1..391097eb 100644 --- a/docs/configuration/inbound/tun.zh.md +++ b/docs/configuration/inbound/tun.zh.md @@ -398,11 +398,11 @@ UDP NAT 过期时间。 TCP/IP 栈。 -| 栈 | 描述 | -|--------|------------------------------------------------------------------| -| system | 基于系统网络栈执行 L3 到 L4 转换 | -| gVisor | 基于 [gVisor](https://github.com/google/gvisor) 虚拟网络栈执行 L3 到 L4 转换 | -| mixed | 混合 `system` TCP 栈与 `gvisor` UDP 栈 | +| 栈 | 描述 | +|----------|-------------------------------------------------------------------------------------------------------| +| `system` | 基于系统网络栈执行 L3 到 L4 转换 | +| `gvisor` | 基于 [gVisor](https://github.com/google/gvisor) 虚拟网络栈执行 L3 到 L4 转换 | +| `mixed` | 混合 `system` TCP 栈与 `gvisor` UDP 栈 | 默认使用 `mixed` 栈如果 gVisor 构建标记已启用,否则默认使用 `system` 栈。 From dba0b5276bbbf70905bd7db584ea0273c2b25b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 27 May 2025 14:11:37 +0800 Subject: [PATCH 12/14] Bump version --- clients/android | 2 +- docs/changelog.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clients/android b/clients/android index cec05bf6..c0885a2d 160000 --- a/clients/android +++ b/clients/android @@ -1 +1 @@ -Subproject commit cec05bf6935eca219a722883212ae8880d2e863e +Subproject commit c0885a2dc304797336756c8066c77bb4c193b009 diff --git a/docs/changelog.md b/docs/changelog.md index e1aa7942..7586b032 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,13 @@ icon: material/alert-decagram --- +### 1.11.12 + +* Fixes and improvements + +_We are temporarily unable to update sing-box apps on the App Store because the reviewer mistakenly found that we +violated the rules (TestFlight users are not affected)._ + ### 1.11.11 * Fixes and improvements From 098a00b0257cbb8721870a6f5d7d1dd990f07a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Wed, 4 Jun 2025 23:23:36 +0800 Subject: [PATCH 13/14] Fix v2ray websocket transport --- transport/v2raywebsocket/conn.go | 21 +++++++++++---------- transport/v2raywebsocket/deadline.go | 22 ---------------------- transport/v2raywebsocket/writer.go | 2 +- 3 files changed, 12 insertions(+), 33 deletions(-) delete mode 100644 transport/v2raywebsocket/deadline.go diff --git a/transport/v2raywebsocket/conn.go b/transport/v2raywebsocket/conn.go index a796e612..7f347dc9 100644 --- a/transport/v2raywebsocket/conn.go +++ b/transport/v2raywebsocket/conn.go @@ -62,15 +62,16 @@ func (c *WebsocketConn) Close() error { func (c *WebsocketConn) Read(b []byte) (n int, err error) { var header ws.Header for { - n, err = wrapWsError0(c.reader.Read(b)) + n, err = c.reader.Read(b) if n > 0 { err = nil return } if !E.IsMulti(err, io.EOF, wsutil.ErrNoFrameAdvance) { + err = wrapWsError(err) return } - header, err = c.reader.NextFrame() + header, err = wrapWsError0(c.reader.NextFrame()) if err != nil { return } @@ -79,14 +80,14 @@ func (c *WebsocketConn) Read(b []byte) (n int, err error) { err = wsutil.ErrFrameTooLarge return } - err = c.controlHandler(header, c.reader) + err = wrapWsError(c.controlHandler(header, c.reader)) if err != nil { return } continue } if header.OpCode&ws.OpBinary == 0 { - err = c.reader.Discard() + err = wrapWsError(c.reader.Discard()) if err != nil { return } @@ -178,12 +179,12 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error { conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers) } if err != nil { - return wrapWsError(err) + return err } if len(lateData) > 0 { _, err = conn.Write(lateData) if err != nil { - return wrapWsError(err) + return err } } c.conn = conn @@ -202,7 +203,7 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) { if c.conn != nil { return wrapWsError0(c.conn.Write(b)) } - err = wrapWsError(c.writeRequest(b)) + err = c.writeRequest(b) c.err = err close(c.create) if err != nil { @@ -223,7 +224,7 @@ func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error { if c.err != nil { return c.err } - err := wrapWsError(c.writeRequest(buffer.Bytes())) + err := c.writeRequest(buffer.Bytes()) c.err = err close(c.create) return err @@ -278,7 +279,7 @@ func wrapWsError(err error) error { if err == nil { return nil } - var closedErr *wsutil.ClosedError + var closedErr wsutil.ClosedError if errors.As(err, &closedErr) { if closedErr.Code == ws.StatusNormalClosure { err = io.EOF @@ -291,5 +292,5 @@ func wrapWsError0[T any](value T, err error) (T, error) { if err == nil { return value, nil } - return common.DefaultValue[T](), wrapWsError(err) + return value, wrapWsError(err) } diff --git a/transport/v2raywebsocket/deadline.go b/transport/v2raywebsocket/deadline.go deleted file mode 100644 index 195565aa..00000000 --- a/transport/v2raywebsocket/deadline.go +++ /dev/null @@ -1,22 +0,0 @@ -package v2raywebsocket - -import ( - "net" - "time" -) - -type deadConn struct { - net.Conn -} - -func (c *deadConn) SetDeadline(t time.Time) error { - return nil -} - -func (c *deadConn) SetReadDeadline(t time.Time) error { - return nil -} - -func (c *deadConn) SetWriteDeadline(t time.Time) error { - return nil -} diff --git a/transport/v2raywebsocket/writer.go b/transport/v2raywebsocket/writer.go index 5bd0d0a1..c08a654f 100644 --- a/transport/v2raywebsocket/writer.go +++ b/transport/v2raywebsocket/writer.go @@ -66,7 +66,7 @@ func (w *Writer) WriteBuffer(buffer *buf.Buffer) error { ws.Cipher(data, *(*[4]byte)(header[1+payloadBitLength:]), 0) } - return w.writer.WriteBuffer(buffer) + return wrapWsError(w.writer.WriteBuffer(buffer)) } func (w *Writer) FrontHeadroom() int { From 255068fd40e92ca857115322b596801173525a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Wed, 4 Jun 2025 23:25:57 +0800 Subject: [PATCH 14/14] Bump version --- clients/android | 2 +- docs/changelog.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/android b/clients/android index c0885a2d..320170a1 160000 --- a/clients/android +++ b/clients/android @@ -1 +1 @@ -Subproject commit c0885a2dc304797336756c8066c77bb4c193b009 +Subproject commit 320170a1077ea5c93872b3e055b96b8836615ef0 diff --git a/docs/changelog.md b/docs/changelog.md index 7586b032..71f261c9 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,7 +2,7 @@ icon: material/alert-decagram --- -### 1.11.12 +### 1.11.13 * Fixes and improvements