From f02766a76524a6705089e781c26893d24de1b5a1 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 14 Sep 2025 12:17:50 +0800 Subject: [PATCH] fix: reshaping buffer maybe too long in vision --- transport/vless/vision/padding.go | 22 ++++++++++++++-------- transport/vless/vision/vision.go | 4 +++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/transport/vless/vision/padding.go b/transport/vless/vision/padding.go index 157dfee8..ac6de886 100644 --- a/transport/vless/vision/padding.go +++ b/transport/vless/vision/padding.go @@ -47,15 +47,21 @@ func ApplyPadding(buffer *buf.Buffer, command byte, userUUID *[]byte, paddingTLS const xrayBufSize = 8192 func (vc *Conn) ReshapeBuffer(buffer *buf.Buffer) []*buf.Buffer { - if buffer.Len() <= xrayBufSize-PaddingHeaderLen { + const bufferLimit = xrayBufSize - PaddingHeaderLen + if buffer.Len() < bufferLimit { return []*buf.Buffer{buffer} } - cutAt := bytes.LastIndex(buffer.Bytes(), tlsApplicationDataStart) - if cutAt == -1 { - cutAt = xrayBufSize / 2 + options := N.NewReadWaitOptions(nil, vc) + var buffers []*buf.Buffer + for buffer.Len() >= bufferLimit { + cutAt := bytes.LastIndex(buffer.Bytes(), tlsApplicationDataStart) + if cutAt < 21 || cutAt > bufferLimit { + cutAt = xrayBufSize / 2 + } + buffer2 := options.NewBuffer() // ensure the new buffer can send used in vc.WriteBuffer + buf.Must(buf.Error(buffer2.ReadFullFrom(buffer, cutAt))) + buffers = append(buffers, buffer2) } - buffer2 := N.NewReadWaitOptions(nil, vc).NewBuffer() // ensure the new buffer can send used in vc.WriteBuffer - buffer2.Write(buffer.From(cutAt)) - buffer.Truncate(cutAt) - return []*buf.Buffer{buffer, buffer2} + buffers = append(buffers, buffer) + return buffers } diff --git a/transport/vless/vision/vision.go b/transport/vless/vision/vision.go index c5cf3783..e9786981 100644 --- a/transport/vless/vision/vision.go +++ b/transport/vless/vision/vision.go @@ -1,4 +1,6 @@ // Package vision implements VLESS flow `xtls-rprx-vision` introduced by Xray-core. +// +// same logic as https://github.com/XTLS/Xray-core/blob/v25.9.11/proxy/proxy.go package vision import ( @@ -27,7 +29,7 @@ func NewConn(conn net.Conn, tlsConn net.Conn, userUUID uuid.UUID) (*Conn, error) ExtendedWriter: N.NewExtendedWriter(conn), Conn: conn, userUUID: userUUID, - packetsToFilter: 6, + packetsToFilter: 8, readProcess: true, readFilterUUID: true, writeFilterApplicationData: true,