make sure not to return closed session from Listener.Accept()

This commit is contained in:
Marten Seemann
2019-01-06 14:13:13 +07:00
parent 90514d53d1
commit 181aa493e0
3 changed files with 122 additions and 17 deletions

View File

@@ -170,8 +170,13 @@ func (s *server) setup() error {
onHandshakeCompleteImpl: func(sess Session) {
go func() {
atomic.AddInt32(&s.sessionQueueLen, 1)
s.sessionQueue <- sess // blocks until the session is accepted
atomic.AddInt32(&s.sessionQueueLen, -1)
defer atomic.AddInt32(&s.sessionQueueLen, -1)
select {
case s.sessionQueue <- sess:
// blocks until the session is accepted
case <-sess.Context().Done():
// don't pass sessions that were already closed to Accept()
}
}()
},
retireConnectionIDImpl: s.sessionHandler.Retire,