@@ -391,7 +391,9 @@ func (c *Conn) read(n int) ([]byte, error) {
391
391
if err == io .EOF {
392
392
err = errUnexpectedEOF
393
393
}
394
- c .br .Discard (len (p ))
394
+ // Discard is guaranteed to succeed because the number of bytes to discard
395
+ // is less than or equal to the number of bytes buffered.
396
+ _ , _ = c .br .Discard (len (p ))
395
397
return p , err
396
398
}
397
399
@@ -412,7 +414,9 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error
412
414
return ErrNilNetConn
413
415
}
414
416
415
- c .conn .SetWriteDeadline (deadline )
417
+ if err := c .conn .SetWriteDeadline (deadline ); err != nil {
418
+ return c .writeFatal (err )
419
+ }
416
420
if len (buf1 ) == 0 {
417
421
_ , err = c .conn .Write (buf0 )
418
422
} else {
@@ -422,7 +426,7 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error
422
426
return c .writeFatal (err )
423
427
}
424
428
if frameType == CloseMessage {
425
- c .writeFatal (ErrCloseSent )
429
+ _ = c .writeFatal (ErrCloseSent )
426
430
}
427
431
return nil
428
432
}
@@ -464,21 +468,27 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
464
468
maskBytes (key , 0 , buf [6 :])
465
469
}
466
470
467
- d := 1000 * time .Hour
468
- if ! deadline .IsZero () {
469
- d = deadline .Sub (time .Now ())
471
+ if deadline .IsZero () {
472
+ // No timeout for zero time.
473
+ <- c .mu
474
+ } else {
475
+ d := time .Until (deadline )
470
476
if d < 0 {
471
477
return errWriteTimeout
472
478
}
479
+ select {
480
+ case <- c .mu :
481
+ default :
482
+ timer := time .NewTimer (d )
483
+ select {
484
+ case <- c .mu :
485
+ timer .Stop ()
486
+ case <- timer .C :
487
+ return errWriteTimeout
488
+ }
489
+ }
473
490
}
474
491
475
- timer := time .NewTimer (d )
476
- select {
477
- case <- c .mu :
478
- timer .Stop ()
479
- case <- timer .C :
480
- return errWriteTimeout
481
- }
482
492
defer func () { c .mu <- struct {}{} }()
483
493
484
494
c .writeErrMu .Lock ()
@@ -491,13 +501,14 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
491
501
return ErrNilNetConn
492
502
}
493
503
494
- c .conn .SetWriteDeadline (deadline )
495
- _ , err = c .conn .Write (buf )
496
- if err != nil {
504
+ if err := c .conn .SetWriteDeadline (deadline ); err != nil {
505
+ return c .writeFatal (err )
506
+ }
507
+ if _ , err = c .conn .Write (buf ); err != nil {
497
508
return c .writeFatal (err )
498
509
}
499
510
if messageType == CloseMessage {
500
- c .writeFatal (ErrCloseSent )
511
+ _ = c .writeFatal (ErrCloseSent )
501
512
}
502
513
return err
503
514
}
@@ -670,7 +681,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error {
670
681
}
671
682
672
683
if final {
673
- w .endMessage (errWriteClosed )
684
+ _ = w .endMessage (errWriteClosed )
674
685
return nil
675
686
}
676
687
@@ -865,7 +876,7 @@ func (c *Conn) advanceFrame() (int, error) {
865
876
rsv2 := p [0 ]& rsv2Bit != 0
866
877
rsv3 := p [0 ]& rsv3Bit != 0
867
878
mask := p [1 ]& maskBit != 0
868
- c .setReadRemaining (int64 (p [1 ] & 0x7f ))
879
+ _ = c .setReadRemaining (int64 (p [1 ] & 0x7f )) // will not fail because argument is >= 0
869
880
870
881
c .readDecompress = false
871
882
if rsv1 {
@@ -970,7 +981,8 @@ func (c *Conn) advanceFrame() (int, error) {
970
981
}
971
982
972
983
if c .readLimit > 0 && c .readLength > c .readLimit {
973
- c .WriteControl (CloseMessage , FormatCloseMessage (CloseMessageTooBig , "" ), time .Now ().Add (writeWait ))
984
+ // Make a best effort to send a close message describing the problem.
985
+ _ = c .WriteControl (CloseMessage , FormatCloseMessage (CloseMessageTooBig , "" ), time .Now ().Add (writeWait ))
974
986
return noFrame , ErrReadLimit
975
987
}
976
988
@@ -982,7 +994,7 @@ func (c *Conn) advanceFrame() (int, error) {
982
994
var payload []byte
983
995
if c .readRemaining > 0 {
984
996
payload , err = c .read (int (c .readRemaining ))
985
- c .setReadRemaining (0 )
997
+ _ = c .setReadRemaining (0 ) // will not fail because argument is >= 0
986
998
if err != nil {
987
999
return noFrame , err
988
1000
}
@@ -1032,7 +1044,8 @@ func (c *Conn) handleProtocolError(message string) error {
1032
1044
if len (data ) > maxControlFramePayloadSize {
1033
1045
data = data [:maxControlFramePayloadSize ]
1034
1046
}
1035
- c .WriteControl (CloseMessage , data , time .Now ().Add (writeWait ))
1047
+ // Make a best effor to send a close message describing the problem.
1048
+ _ = c .WriteControl (CloseMessage , data , time .Now ().Add (writeWait ))
1036
1049
return errors .New ("websocket: " + message )
1037
1050
}
1038
1051
@@ -1111,7 +1124,7 @@ func (r *messageReader) Read(b []byte) (int, error) {
1111
1124
}
1112
1125
rem := c .readRemaining
1113
1126
rem -= int64 (n )
1114
- c .setReadRemaining (rem )
1127
+ _ = c .setReadRemaining (rem ) // rem is guaranteed to be >= 0
1115
1128
if c .readRemaining > 0 && c .readErr == io .EOF {
1116
1129
c .readErr = errUnexpectedEOF
1117
1130
}
@@ -1211,7 +1224,8 @@ func (c *Conn) SetCloseHandler(h func(code int, text string) error) {
1211
1224
if h == nil {
1212
1225
h = func (code int , text string ) error {
1213
1226
message := FormatCloseMessage (code , "" )
1214
- c .WriteControl (CloseMessage , message , time .Now ().Add (writeWait ))
1227
+ // Make a best effor to send the close message.
1228
+ _ = c .WriteControl (CloseMessage , message , time .Now ().Add (writeWait ))
1215
1229
return nil
1216
1230
}
1217
1231
}
@@ -1239,7 +1253,7 @@ func (c *Conn) SetPingHandler(h func(appData string) error) {
1239
1253
}
1240
1254
if h == nil {
1241
1255
h = func (message string ) error {
1242
- // Make a best effort to send the pong mesage .
1256
+ // Make a best effort to send the pong message .
1243
1257
_ = c .WriteControl (PongMessage , []byte (message ), time .Now ().Add (writeWait ))
1244
1258
return nil
1245
1259
}
0 commit comments