Merge pull request #1002 from micro/tun-fix

fix bug in the tunnel which causes multicast connections to be closed
This commit is contained in:
Asim Aslam 2019-11-30 01:16:12 +00:00 committed by GitHub
commit 25b3fda25b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 4 deletions

View File

@ -93,6 +93,9 @@ func (t *tun) getSession(channel, session string) (*session, bool) {
// delSession deletes a session if it exists
func (t *tun) delSession(channel, session string) {
t.Lock()
if s, ok := t.sessions[channel+session]; ok {
s.Close()
}
delete(t.sessions, channel+session)
t.Unlock()
}
@ -512,10 +515,10 @@ func (t *tun) listen(link *link) {
}
// try get the dialing socket
s, exists := t.getSession(channel, sessionId)
_, exists := t.getSession(channel, sessionId)
if exists {
// close and continue
s.Close()
// delete and continue
t.delSession(channel, sessionId)
continue
}
// otherwise its a session mapping of sorts

View File

@ -66,6 +66,7 @@ func (t *tunListener) process() {
sess, ok := conns[m.session]
log.Debugf("Tunnel listener received channel %s session %s exists: %t", m.channel, m.session, ok)
if !ok {
// we only process open and session types
switch m.typ {
case "open", "session":
default:
@ -87,7 +88,7 @@ func (t *tunListener) process() {
// the link the message was received on
link: m.link,
// set the connection mode
mode: m.mode,
mode: t.session.mode,
// close chan
closed: make(chan bool),
// recv called by the acceptor

View File

@ -413,6 +413,11 @@ func (s *session) Close() error {
default:
close(s.closed)
// don't broadcast the close for multicast
if s.mode != Unicast {
return nil
}
// append to backlog
msg := s.newMessage("close")
// no error response on close