From 4c0148619ebbc9f2c61736ffb74620b56bd3cf82 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 3 May 2021 10:45:41 -0700 Subject: [PATCH] Fix nil pointer deref on uncommon tor errors --- tor/torProvider.go | 10 +++++++--- tor/torProvider_test.go | 2 -- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tor/torProvider.go b/tor/torProvider.go index 3f3a311..1b00151 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -192,17 +192,22 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne conf := &tor.ListenConf{NoWait: true, Version3: true, Key: identity, RemotePorts: []int{port}, Detach: true, DiscardKey: true, LocalListener: localListener} os, err := tp.t.Listen(nil, conf) + + // Reattach to the old local listener... + // Note: this code probably shouldn't be hit in Cwtch anymore because we purge torrc on restart. if err != nil && strings.Contains(err.Error(), "550 Unspecified Tor error: Onion address collision") { + log.Errorf("550 Unspecified Tor error: Onion address collision - Recovering, but this probably indicates some weird tor configuration issue...") os = &tor.OnionService{Tor: tp.t, LocalListener: localListener, ID: onion, Version3: true, Key: bineed255192.FromCryptoPrivateKey(privkey), ClientAuths: make(map[string]string, 0), RemotePorts: []int{port}} err = nil } - // Not set in t.Listen if supplied, we want it to handle this however - os.CloseLocalListenerOnClose = true + // Any other errors require an immediate return as os is likely nil... if err != nil { return nil, err } + os.CloseLocalListenerOnClose = true + ols := &onionListenService{os: os, tp: tp} tp.childListeners[ols.AddressIdentity()] = ols return ols, nil @@ -218,7 +223,6 @@ func (tp *torProvider) Restart() { return } - go tp.restart() } diff --git a/tor/torProvider_test.go b/tor/torProvider_test.go index dcb0e5d..7400517 100644 --- a/tor/torProvider_test.go +++ b/tor/torProvider_test.go @@ -45,7 +45,5 @@ func TestTorProvider(t *testing.T) { acn.Restart() acn.Restart() - - acn.Close() }