mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-12-12 12:42:26 +04:00
XTLS Vision: Fix IsCompleteRecord() (#5365)
Fixes https://github.com/XTLS/Xray-core/pull/5179
This commit is contained in:
@@ -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
|
||||||
|
for i < totalLen {
|
||||||
|
// record header: 0x17 0x3 0x3 + 2 bytes length
|
||||||
if headerLen > 0 {
|
if headerLen > 0 {
|
||||||
data, _ := buffer2.ReadByte()
|
data := b[i]
|
||||||
|
i++
|
||||||
switch headerLen {
|
switch headerLen {
|
||||||
case 5:
|
case 5:
|
||||||
if data != 0x17 {
|
if data != 0x17 {
|
||||||
isComplete = false
|
return false
|
||||||
break
|
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
if data != 0x03 {
|
if data != 0x03 {
|
||||||
isComplete = false
|
return false
|
||||||
break
|
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
if data != 0x03 {
|
if data != 0x03 {
|
||||||
isComplete = false
|
return false
|
||||||
break
|
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
recordLen = int32(data) << 8
|
recordLen = int(data) << 8
|
||||||
case 1:
|
case 1:
|
||||||
recordLen = recordLen | int32(data)
|
recordLen = recordLen | int(data)
|
||||||
}
|
}
|
||||||
headerLen--
|
headerLen--
|
||||||
} else if recordLen > 0 {
|
} else if recordLen > 0 {
|
||||||
var len = recordLen
|
remaining := totalLen - i
|
||||||
if buffer2.Len() < recordLen{
|
if remaining < recordLen {
|
||||||
len = buffer2.Len()
|
return false
|
||||||
}
|
} else {
|
||||||
buffer2.Advance(len)
|
i += recordLen
|
||||||
recordLen -= len
|
recordLen = 0
|
||||||
if recordLen == 0 {
|
|
||||||
headerLen = 5
|
headerLen = 5
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
isComplete = false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !isComplete {
|
if headerLen == 5 && recordLen == 0 {
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, buffer2 := range mb2 {
|
|
||||||
buffer2.Release()
|
|
||||||
buffer2 = nil
|
|
||||||
}
|
|
||||||
if headerLen == 5 && recordLen == 0 && isComplete {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
Reference in New Issue
Block a user