diff --git a/ipn/local.go b/ipn/local.go index 6e4b6981c..1d61ffa25 100644 --- a/ipn/local.go +++ b/ipn/local.go @@ -1251,11 +1251,21 @@ func (b *LocalBackend) requestEngineStatusAndWait() { // rebooting will fix it. func (b *LocalBackend) Logout() { b.mu.Lock() - b.assertClientLocked() c := b.c b.netMap = nil b.mu.Unlock() + if c == nil { + // Double Logout can happen via repeated IPN + // connections to ipnserver making it repeatedly + // transition from 1->0 total connections, which on + // Windows by default ("client mode") causes a Logout + // on the transition to zero. + // Previously this crashed when we asserted that c was non-nil + // here. + return + } + c.Logout() b.mu.Lock()