@@ -395,65 +395,54 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
395395
396396// IsCompleteRecord Is complete tls data record
397397func 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