@@ -2,6 +2,7 @@ package yamux
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"io"
6
7
"sync"
7
8
"sync/atomic"
@@ -200,6 +201,10 @@ START:
200
201
// Send the header
201
202
s .sendHdr .encode (typeData , flags , s .id , max )
202
203
if err = s .session .waitForSendErr (s .sendHdr , body , s .sendErr ); err != nil {
204
+ if errors .Is (err , ErrSessionShutdown ) || errors .Is (err , ErrConnectionWriteTimeout ) {
205
+ // Message left in ready queue, header re-use is unsafe.
206
+ s .sendHdr = header (make ([]byte , headerSize ))
207
+ }
203
208
return 0 , err
204
209
}
205
210
@@ -273,6 +278,10 @@ func (s *Stream) sendWindowUpdate() error {
273
278
// Send the header
274
279
s .controlHdr .encode (typeWindowUpdate , flags , s .id , delta )
275
280
if err := s .session .waitForSendErr (s .controlHdr , nil , s .controlErr ); err != nil {
281
+ if errors .Is (err , ErrSessionShutdown ) || errors .Is (err , ErrConnectionWriteTimeout ) {
282
+ // Message left in ready queue, header re-use is unsafe.
283
+ s .controlHdr = header (make ([]byte , headerSize ))
284
+ }
276
285
return err
277
286
}
278
287
return nil
@@ -287,6 +296,10 @@ func (s *Stream) sendClose() error {
287
296
flags |= flagFIN
288
297
s .controlHdr .encode (typeWindowUpdate , flags , s .id , 0 )
289
298
if err := s .session .waitForSendErr (s .controlHdr , nil , s .controlErr ); err != nil {
299
+ if errors .Is (err , ErrSessionShutdown ) || errors .Is (err , ErrConnectionWriteTimeout ) {
300
+ // Message left in ready queue, header re-use is unsafe.
301
+ s .controlHdr = header (make ([]byte , headerSize ))
302
+ }
290
303
return err
291
304
}
292
305
return nil
@@ -362,8 +375,9 @@ func (s *Stream) closeTimeout() {
362
375
// Send a RST so the remote side closes too.
363
376
s .sendLock .Lock ()
364
377
defer s .sendLock .Unlock ()
365
- s .sendHdr .encode (typeWindowUpdate , flagRST , s .id , 0 )
366
- s .session .sendNoWait (s .sendHdr )
378
+ hdr := header (make ([]byte , headerSize ))
379
+ hdr .encode (typeWindowUpdate , flagRST , s .id , 0 )
380
+ s .session .sendNoWait (hdr )
367
381
}
368
382
369
383
// forceClose is used for when the session is exiting
0 commit comments