1
mirror of https://github.com/XTLS/Xray-core.git synced 2025-12-12 12:42:26 +04:00

Fix IsCompleteRecord()

This commit is contained in:
风扇滑翔翼
2025-12-02 08:36:26 +00:00
committed by GitHub
parent 36cb0f00bd
commit b5e54e92fb

View File

@@ -395,64 +395,53 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
// IsCompleteRecord Is complete tls data record // IsCompleteRecord Is complete tls data record
func IsCompleteRecord(buffer buf.MultiBuffer) bool { func IsCompleteRecord(buffer buf.MultiBuffer) bool {
mb2 := make(buf.MultiBuffer, 0, len(buffer)) b := make([]byte, buffer.Len())
for _, buffer1 := range buffer { if buffer.Copy(b) != int(buffer.Len()) {
buffer2 := buf.New() panic("impossible bytes allocation")
buffer2.Write(buffer1.Bytes())
mb2 = append(mb2, buffer2)
} }
isComplete := true var headerLen int = 5
var headerLen int32 = 5 var recordLen int
var recordLen int32
for _, buffer2 := range mb2 { totalLen := len(b)
for buffer2.Len() > 0 { i := 0
if headerLen > 0 { for i < totalLen {
data, _ := buffer2.ReadByte() // record header: 0x17 0x3 0x3 + 2 bytes length
switch headerLen { if headerLen > 0 {
case 5: data := b[i]
if data != 0x17 { i++
isComplete = false switch headerLen {
break case 5:
} if data != 0x17 {
case 4: return false
if data != 0x03 {
isComplete = false
break
}
case 3:
if data != 0x03 {
isComplete = false
break
}
case 2:
recordLen = int32(data) << 8
case 1:
recordLen = recordLen | int32(data)
} }
headerLen-- case 4:
} else if recordLen > 0 { if data != 0x03 {
var len = recordLen return false
if buffer2.Len() < recordLen{
len = buffer2.Len()
} }
buffer2.Advance(len) case 3:
recordLen -= len if data != 0x03 {
if recordLen == 0 { return false
headerLen = 5
} }
} else { case 2:
isComplete = false recordLen = int(data) << 8
case 1:
recordLen = recordLen | int(data)
} }
} headerLen--
if !isComplete { } else if recordLen > 0 {
break remaining := totalLen - i
if remaining < recordLen {
return false
} else {
i += recordLen
recordLen = 0
headerLen = 5
}
} else {
return false
} }
} }
for _, buffer2 := range mb2 { if headerLen == 5 && recordLen == 0 {
buffer2.Release()
buffer2 = nil
}
if headerLen == 5 && recordLen == 0 && isComplete {
return true return true
} }
return false return false