@@ -55,7 +55,10 @@ func newTestConn(r io.Reader, w io.Writer, isServer bool) *Conn {
55
55
}
56
56
57
57
func TestFraming (t * testing.T ) {
58
- frameSizes := []int {0 , 1 , 2 , 124 , 125 , 126 , 127 , 128 , 129 , 65534 , 65535 , 65536 , 65537 }
58
+ frameSizes := []int {
59
+ 0 , 1 , 2 , 124 , 125 , 126 , 127 , 128 , 129 , 65534 , 65535 ,
60
+ // 65536, 65537
61
+ }
59
62
var readChunkers = []struct {
60
63
name string
61
64
f func (io.Reader ) io.Reader
@@ -120,6 +123,8 @@ func TestFraming(t *testing.T) {
120
123
t .Errorf ("%s: NextReader() returned %d, r, %v" , name , opCode , err )
121
124
continue
122
125
}
126
+
127
+ t .Logf ("frame size: %d" , n )
123
128
rbuf , err := ioutil .ReadAll (r )
124
129
if err != nil {
125
130
t .Errorf ("%s: ReadFull() returned rbuf, %v" , name , err )
@@ -458,37 +463,93 @@ func TestWriteAfterMessageWriterClose(t *testing.T) {
458
463
}
459
464
460
465
func TestReadLimit (t * testing.T ) {
466
+ t .Run ("Test ReadLimit is enforced" , func (t * testing.T ) {
467
+ const readLimit = 512
468
+ message := make ([]byte , readLimit + 1 )
461
469
462
- const readLimit = 512
463
- message := make ([]byte , readLimit + 1 )
470
+ var b1 , b2 bytes.Buffer
471
+ wc := newConn (& fakeNetConn {Writer : & b1 }, false , 1024 , readLimit - 2 , nil , nil , nil )
472
+ rc := newTestConn (& b1 , & b2 , true )
473
+ rc .SetReadLimit (readLimit )
464
474
465
- var b1 , b2 bytes.Buffer
466
- wc := newConn (& fakeNetConn {Writer : & b1 }, false , 1024 , readLimit - 2 , nil , nil , nil )
467
- rc := newTestConn (& b1 , & b2 , true )
468
- rc .SetReadLimit (readLimit )
475
+ // Send message at the limit with interleaved pong.
476
+ w , _ := wc .NextWriter (BinaryMessage )
477
+ w .Write (message [:readLimit - 1 ])
478
+ wc .WriteControl (PongMessage , []byte ("this is a pong" ), time .Now ().Add (10 * time .Second ))
479
+ w .Write (message [:1 ])
480
+ w .Close ()
469
481
470
- // Send message at the limit with interleaved pong.
471
- w , _ := wc .NextWriter (BinaryMessage )
472
- w .Write (message [:readLimit - 1 ])
473
- wc .WriteControl (PongMessage , []byte ("this is a pong" ), time .Now ().Add (10 * time .Second ))
474
- w .Write (message [:1 ])
475
- w .Close ()
482
+ // Send message larger than the limit.
483
+ wc .WriteMessage (BinaryMessage , message [:readLimit + 1 ])
476
484
477
- // Send message larger than the limit.
478
- wc .WriteMessage (BinaryMessage , message [:readLimit + 1 ])
485
+ op , _ , err := rc .NextReader ()
486
+ if op != BinaryMessage || err != nil {
487
+ t .Fatalf ("1: NextReader() returned %d, %v" , op , err )
488
+ }
489
+ op , r , err := rc .NextReader ()
490
+ if op != BinaryMessage || err != nil {
491
+ t .Fatalf ("2: NextReader() returned %d, %v" , op , err )
492
+ }
493
+ _ , err = io .Copy (ioutil .Discard , r )
494
+ if err != ErrReadLimit {
495
+ t .Fatalf ("io.Copy() returned %v" , err )
496
+ }
497
+ })
479
498
480
- op , _ , err := rc .NextReader ()
481
- if op != BinaryMessage || err != nil {
482
- t .Fatalf ("1: NextReader() returned %d, %v" , op , err )
483
- }
484
- op , r , err := rc .NextReader ()
485
- if op != BinaryMessage || err != nil {
486
- t .Fatalf ("2: NextReader() returned %d, %v" , op , err )
487
- }
488
- _ , err = io .Copy (ioutil .Discard , r )
489
- if err != ErrReadLimit {
490
- t .Fatalf ("io.Copy() returned %v" , err )
491
- }
499
+ t .Run ("Test that ReadLimit cannot be overflowed" , func (t * testing.T ) {
500
+ const readLimit = 1
501
+
502
+ var b1 , b2 bytes.Buffer
503
+ rc := newTestConn (& b1 , & b2 , true )
504
+ rc .SetReadLimit (readLimit )
505
+
506
+ // First, send a non-final binary message
507
+ b1 .Write ([]byte ("\x02 \x81 " ))
508
+
509
+ // Mask key
510
+ b1 .Write ([]byte ("\x00 \x00 \x00 \x00 " ))
511
+
512
+ // First payload
513
+ b1 .Write ([]byte ("A" ))
514
+
515
+ // Next, send a negative-length, non-final continuation frame
516
+ b1 .Write ([]byte ("\x00 \xFF \x80 \x00 \x00 \x00 \x00 \x00 \x00 \x00 " ))
517
+
518
+ // Mask key
519
+ b1 .Write ([]byte ("\x00 \x00 \x00 \x00 " ))
520
+
521
+ // Next, send a too long, final continuation frame
522
+ b1 .Write ([]byte ("\x80 \xFF \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 " ))
523
+
524
+ // Mask key
525
+ b1 .Write ([]byte ("\x00 \x00 \x00 \x00 " ))
526
+
527
+ // Too-long payload
528
+ b1 .Write ([]byte ("BCDEF" ))
529
+
530
+ op , r , err := rc .NextReader ()
531
+ if op != BinaryMessage || err != nil {
532
+ t .Fatalf ("1: NextReader() returned %d, %v" , op , err )
533
+ }
534
+
535
+ var buf [10 ]byte
536
+ var read int
537
+ n , err := r .Read (buf [:])
538
+ if err != nil && err != ErrReadLimit {
539
+ t .Fatalf ("unexpected error testing read limit: %v" , err )
540
+ }
541
+ read += n
542
+
543
+ n , err = r .Read (buf [:])
544
+ if err != nil && err != ErrReadLimit {
545
+ t .Fatalf ("unexpected error testing read limit: %v" , err )
546
+ }
547
+ read += n
548
+
549
+ if err == nil && read > readLimit {
550
+ t .Fatalf ("read limit exceeded: limit %d, read %d" , readLimit , read )
551
+ }
552
+ })
492
553
}
493
554
494
555
func TestAddrs (t * testing.T ) {
0 commit comments