From 1e237633f1a4200f976c0dd542d5dedb9f0837d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Thu, 2 Jul 2026 15:46:37 +0800 Subject: [PATCH] tls: Fix read wait buffer sizing --- common/tls/apple_client_platform.go | 31 ++++++++++------------------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/common/tls/apple_client_platform.go b/common/tls/apple_client_platform.go index 9e2b7b53e..1eb0ccf64 100644 --- a/common/tls/apple_client_platform.go +++ b/common/tls/apple_client_platform.go @@ -520,10 +520,6 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { if c.readEOF { return nil, io.EOF } - maximumLen := readWaitFreeLen(w.options) - if maximumLen <= 0 { - return nil, io.ErrShortBuffer - } timeoutMs, err := c.prepareReadTimeout() if err != nil { return nil, err @@ -533,11 +529,18 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { return nil, err } defer c.releaseClient() + buffer := w.options.NewBuffer() + if buffer.IsFull() { + buffer.Release() + return nil, io.ErrShortBuffer + } + maximumLen := buffer.FreeLen() handle := cgo.NewHandle(w) defer handle.Delete() var errorPtr *C.char if !bool(C.box_apple_tls_client_read_async(client, C.size_t(maximumLen), C.uintptr_t(handle), &errorPtr)) { + buffer.Release() return nil, c.errorFromPointer(errorPtr) } @@ -553,22 +556,18 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { if result != nil { C.box_apple_tls_read_result_free(result) } + buffer.Release() c.markReadTimedOut() return nil, os.ErrDeadlineExceeded } } else { result = <-w.results } - return c.readWaitResultToBuffer(result, w.options) + return c.readWaitResultToBuffer(result, buffer, w.options) } -func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_result_t, options N.ReadWaitOptions) (*buf.Buffer, error) { +func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_result_t, buffer *buf.Buffer, options N.ReadWaitOptions) (*buf.Buffer, error) { defer C.box_apple_tls_read_result_free(result) - buffer := options.NewBuffer() - if buffer.IsFull() { - buffer.Release() - return nil, io.ErrShortBuffer - } startLen := buffer.Len() var eof C.bool var errorPtr *C.char @@ -593,16 +592,6 @@ func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_resul return buffer, nil } -func readWaitFreeLen(options N.ReadWaitOptions) int { - if options.IncreaseBuffer { - return 65535 - options.FrontHeadroom - options.RearHeadroom - } - if options.MTU > 0 { - return options.MTU - } - return buf.BufferSize - options.FrontHeadroom - options.RearHeadroom -} - //export box_apple_tls_read_callback func box_apple_tls_read_callback(callbackHandle C.uintptr_t, result *C.box_apple_tls_read_result_t) { handle := cgo.Handle(callbackHandle) diff --git a/go.mod b/go.mod index 099de75b2..a8bdd2d43 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/sagernet/gomobile v0.1.12 github.com/sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1 github.com/sagernet/quic-go v0.59.0-sing-box-mod.4 - github.com/sagernet/sing v0.8.12-0.20260701111927-87e1e819f10a + github.com/sagernet/sing v0.8.12-0.20260702074557-63e2fd680d8a github.com/sagernet/sing-cloudflared v0.1.1 github.com/sagernet/sing-mux v0.3.5 github.com/sagernet/sing-quic v0.6.4-0.20260709030527-cff0b763485d diff --git a/go.sum b/go.sum index b96b27e41..645a6b9a0 100644 --- a/go.sum +++ b/go.sum @@ -258,8 +258,8 @@ github.com/sagernet/nftables v0.3.0-mod.2 h1:ck2KMU02OxL1eDFgGaWYglMDpoOZ7OHzxje github.com/sagernet/nftables v0.3.0-mod.2/go.mod h1:8kslHG4VvYNihcco+i6uxIX7qbT8A56T0y5q7U44ZaQ= github.com/sagernet/quic-go v0.59.0-sing-box-mod.4 h1:6qvrUW79S+CrPwWz6cMePXohgjHoKxLo3c+MDhNwc3o= github.com/sagernet/quic-go v0.59.0-sing-box-mod.4/go.mod h1:OqILvS182CyOol5zNNo6bguvOGgXzV459+chpRaUC+4= -github.com/sagernet/sing v0.8.12-0.20260701111927-87e1e819f10a h1:MCid6UN8a7WZWziqlWbLRFOt2jsfNZ7HRYEbP+MxX0U= -github.com/sagernet/sing v0.8.12-0.20260701111927-87e1e819f10a/go.mod h1:olXxWQNqRW/l2Q6JI3b2Qmz8iQnIFlOeeH8bx6JhgUA= +github.com/sagernet/sing v0.8.12-0.20260702074557-63e2fd680d8a h1:I8FFJ8IOS+vUSNIq7L1pzBv0fMI507FEpe2CzmT0Jz0= +github.com/sagernet/sing v0.8.12-0.20260702074557-63e2fd680d8a/go.mod h1:olXxWQNqRW/l2Q6JI3b2Qmz8iQnIFlOeeH8bx6JhgUA= github.com/sagernet/sing-cloudflared v0.1.1 h1:By29ZWMJl8QU6UcC5pmBv803rYigAoSmzhDFOZc3h18= github.com/sagernet/sing-cloudflared v0.1.1/go.mod h1:bH2NKX+NpDTY1Zkxfboxw6MXB/ZywaNLmrDJYgKMJ2Y= github.com/sagernet/sing-mux v0.3.5 h1:RHnhVEc+SFqkrK4xMygYjDwwLhzp2Bj3lztSukONfhI=