diff --git a/src/yggdrasil/conn.go b/src/yggdrasil/conn.go index 53d2551e..38e4df9f 100644 --- a/src/yggdrasil/conn.go +++ b/src/yggdrasil/conn.go @@ -256,7 +256,7 @@ func (c *Conn) Close() error { defer c.mutex.Unlock() if c.session != nil { // Close the session, if it hasn't been closed already - c.session.close() + c.core.router.doAdmin(c.session.close) } // This can't fail yet - TODO? c.closed = true diff --git a/src/yggdrasil/session.go b/src/yggdrasil/session.go index 98a12c7b..4cc059e6 100644 --- a/src/yggdrasil/session.go +++ b/src/yggdrasil/session.go @@ -269,8 +269,11 @@ func (ss *sessions) cleanup() { // Closes a session, removing it from sessions maps and killing the worker goroutine. func (sinfo *sessionInfo) close() { - delete(sinfo.core.sessions.sinfos, sinfo.myHandle) - delete(sinfo.core.sessions.byTheirPerm, sinfo.theirPermPub) + if s := sinfo.core.sessions.sinfos[sinfo.myHandle]; s == sinfo { + delete(sinfo.core.sessions.sinfos, sinfo.myHandle) + delete(sinfo.core.sessions.byTheirPerm, sinfo.theirPermPub) + } + defer func() { recover() }() close(sinfo.worker) }