Skip to content

Commit 93312d2

Browse files
authored
XTLS Vision: Fix IsCompleteRecord() (#5365)
Fixes #5179
1 parent 36cb0f0 commit 93312d2

1 file changed

Lines changed: 41 additions & 52 deletions

File tree

proxy/proxy.go

Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -395,65 +395,54 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
395395

396396
// IsCompleteRecord Is complete tls data record
397397
func IsCompleteRecord(buffer buf.MultiBuffer) bool {
398-
mb2 := make(buf.MultiBuffer, 0, len(buffer))
399-
for _, buffer1 := range buffer {
400-
buffer2 := buf.New()
401-
buffer2.Write(buffer1.Bytes())
402-
mb2 = append(mb2, buffer2)
403-
}
404-
isComplete := true
405-
var headerLen int32 = 5
406-
var recordLen int32
407-
for _, buffer2 := range mb2 {
408-
for buffer2.Len() > 0 {
409-
if headerLen > 0 {
410-
data, _ := buffer2.ReadByte()
411-
switch headerLen {
412-
case 5:
413-
if data != 0x17 {
414-
isComplete = false
415-
break
416-
}
417-
case 4:
418-
if data != 0x03 {
419-
isComplete = false
420-
break
421-
}
422-
case 3:
423-
if data != 0x03 {
424-
isComplete = false
425-
break
426-
}
427-
case 2:
428-
recordLen = int32(data) << 8
429-
case 1:
430-
recordLen = recordLen | int32(data)
398+
b := make([]byte, buffer.Len())
399+
if buffer.Copy(b) != int(buffer.Len()) {
400+
panic("impossible bytes allocation")
401+
}
402+
var headerLen int = 5
403+
var recordLen int
404+
405+
totalLen := len(b)
406+
i := 0
407+
for i < totalLen {
408+
// record header: 0x17 0x3 0x3 + 2 bytes length
409+
if headerLen > 0 {
410+
data := b[i]
411+
i++
412+
switch headerLen {
413+
case 5:
414+
if data != 0x17 {
415+
return false
431416
}
432-
headerLen--
433-
} else if recordLen > 0 {
434-
var len = recordLen
435-
if buffer2.Len() < recordLen{
436-
len = buffer2.Len()
417+
case 4:
418+
if data != 0x03 {
419+
return false
437420
}
438-
buffer2.Advance(len)
439-
recordLen -= len
440-
if recordLen == 0 {
441-
headerLen = 5
421+
case 3:
422+
if data != 0x03 {
423+
return false
442424
}
425+
case 2:
426+
recordLen = int(data) << 8
427+
case 1:
428+
recordLen = recordLen | int(data)
429+
}
430+
headerLen--
431+
} else if recordLen > 0 {
432+
remaining := totalLen - i
433+
if remaining < recordLen {
434+
return false
443435
} else {
444-
isComplete = false
436+
i += recordLen
437+
recordLen = 0
438+
headerLen = 5
445439
}
440+
} else {
441+
return false
446442
}
447-
if !isComplete {
448-
break
449-
}
450-
}
451-
for _, buffer2 := range mb2 {
452-
buffer2.Release()
453-
buffer2 = nil
454443
}
455-
if headerLen == 5 && recordLen == 0 && isComplete {
456-
return true
444+
if headerLen == 5 && recordLen == 0 {
445+
return true
457446
}
458447
return false
459448
}

0 commit comments

Comments
 (0)