@@ -72,27 +72,22 @@ func (sniffer *QuicSniffer) SniffData(b []byte) (string, error) {
72
72
func (sniffer * QuicSniffer ) WrapperSender (packetSender constant.PacketSender , override bool ) constant.PacketSender {
73
73
return & quicPacketSender {
74
74
sender : packetSender ,
75
- buffer : make ([]quicDataBlock , 0 ),
76
75
chClose : make (chan struct {}),
77
76
override : override ,
78
77
}
79
78
}
80
79
81
- type quicDataBlock struct {
82
- offset uint64
83
- length uint64
84
- data []byte
85
- }
86
-
87
80
var _ constant.PacketSender = (* quicPacketSender )(nil )
88
81
89
82
type quicPacketSender struct {
90
83
lock sync.RWMutex
91
- buffer [] quicDataBlock
92
- sender constant. PacketSender
84
+ ranges utils. IntRanges [ uint64 ]
85
+ buffer * buf. Buffer
93
86
result string
94
87
override bool
95
88
89
+ sender constant.PacketSender
90
+
96
91
chClose chan struct {}
97
92
closed bool
98
93
}
@@ -144,11 +139,18 @@ func (q *quicPacketSender) Close() {
144
139
145
140
func (q * quicPacketSender ) close () {
146
141
q .lock .Lock ()
142
+ q .closeLocked ()
143
+ q .lock .Unlock ()
144
+ }
145
+
146
+ func (q * quicPacketSender ) closeLocked () {
147
147
if ! q .closed {
148
148
close (q .chClose )
149
149
q .closed = true
150
+ q .buffer .Release ()
151
+ q .buffer = nil
152
+ q .ranges = nil
150
153
}
151
- q .lock .Unlock ()
152
154
}
153
155
154
156
func (q * quicPacketSender ) readQuicData (b []byte ) error {
@@ -287,6 +289,14 @@ func (q *quicPacketSender) readQuicData(b []byte) error {
287
289
buffer = buf .As (decrypted )
288
290
289
291
for i := 0 ; ! buffer .IsEmpty (); i ++ {
292
+ q .lock .RLock ()
293
+ if q .closed {
294
+ q .lock .RUnlock ()
295
+ // close() was called, just return
296
+ return nil
297
+ }
298
+ q .lock .RUnlock ()
299
+
290
300
frameType := byte (0x0 ) // Default to PADDING frame
291
301
for frameType == 0x0 && ! buffer .IsEmpty () {
292
302
frameType , _ = buffer .ReadByte ()
@@ -337,26 +347,32 @@ func (q *quicPacketSender) readQuicData(b []byte) error {
337
347
return io .ErrUnexpectedEOF
338
348
}
339
349
340
- q .lock .RLock ()
341
- if q .buffer == nil {
342
- q .lock .RUnlock ()
343
- // sniffDone() was called, return the connection
344
- return nil
350
+ end := offset + length
351
+ if end > buf .UDPBufferSize { // same as buf.NewPacket().Cap()
352
+ return io .ErrShortBuffer
345
353
}
346
- q .lock .RUnlock ()
347
354
348
- data = make ([]byte , length )
355
+ q .lock .Lock ()
356
+ if q .closed {
357
+ q .lock .Unlock ()
358
+ // close() was called, just return
359
+ return nil
360
+ }
361
+ if q .buffer == nil {
362
+ q .buffer = buf .NewPacket ()
363
+ }
349
364
350
- if _ , err := buffer .Read (data ); err != nil { // Field: Crypto Data
365
+ extendSize := int (end ) - q .buffer .Len ()
366
+ if extendSize > 0 {
367
+ q .buffer .Extend (extendSize )
368
+ }
369
+ target := q .buffer .Range (int (offset ), int (end ))
370
+ if _ , err := buffer .Read (target ); err != nil { // Field: Crypto Data
371
+ q .lock .Unlock ()
351
372
return io .ErrUnexpectedEOF
352
373
}
353
-
354
- q .lock .Lock ()
355
- q .buffer = append (q .buffer , quicDataBlock {
356
- offset : offset ,
357
- length : length ,
358
- data : data ,
359
- })
374
+ q .ranges = append (q .ranges , utils .NewRange (offset , end ))
375
+ q .ranges = q .ranges .Merge ()
360
376
q .lock .Unlock ()
361
377
case 0x1c : // CONNECTION_CLOSE frame, only 0x1c is permitted in initial packet
362
378
if _ , err = quicvarint .Read (buffer ); err != nil { // Field: Error Code
@@ -387,50 +403,29 @@ func (q *quicPacketSender) readQuicData(b []byte) error {
387
403
func (q * quicPacketSender ) tryAssemble () error {
388
404
q .lock .RLock ()
389
405
390
- if q .buffer == nil {
406
+ if q .closed {
391
407
q .lock .RUnlock ()
408
+ // close() was called, just return
392
409
return nil
393
410
}
394
411
395
- var frameLen uint64
396
- for _ , fragment := range q .buffer {
397
- frameLen += fragment .length
398
- }
399
-
400
- buffer := buf .NewSize (int (frameLen ))
401
-
402
- var index uint64
403
- var length int
404
-
405
- loop:
406
- for {
407
- for _ , fragment := range q .buffer {
408
- if fragment .offset == index {
409
- if _ , err := buffer .Write (fragment .data ); err != nil {
410
- return err
411
- }
412
- index = fragment .offset + fragment .length
413
- length ++
414
- continue loop
415
- }
416
- }
417
-
418
- break
412
+ if q .buffer == nil || len (q .ranges ) != 1 || q .ranges [0 ].Start () != 0 || q .ranges [0 ].End () != uint64 (q .buffer .Len ()) {
413
+ q .lock .RUnlock ()
414
+ return ErrNoClue
419
415
}
420
416
421
- domain , err := ReadClientHello (buffer .Bytes ())
417
+ domain , err := ReadClientHello (q .buffer .Bytes ())
418
+ q .lock .RUnlock ()
422
419
if err != nil {
423
- q .lock .RUnlock ()
424
420
return err
425
421
}
426
- q .lock .RUnlock ()
427
422
428
423
q .lock .Lock ()
429
424
q .result = * domain
425
+ q .closeLocked ()
430
426
q .lock .Unlock ()
431
- q .close ()
432
427
433
- return err
428
+ return nil
434
429
}
435
430
436
431
func hkdfExpandLabel (hash crypto.Hash , secret , context []byte , label string , length int ) []byte {
0 commit comments