From e096f2feb1ee05602bff82e0ae11cebae82e26af Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 15:32:28 +0100 Subject: [PATCH 1/8] Added unregisterEventsHandler to destructor of TorControlDialog --- retroshare-gui/src/TorControl/TorControlWindow.cpp | 5 +++++ retroshare-gui/src/TorControl/TorControlWindow.h | 1 + 2 files changed, 6 insertions(+) diff --git a/retroshare-gui/src/TorControl/TorControlWindow.cpp b/retroshare-gui/src/TorControl/TorControlWindow.cpp index f60e121f3..c369a6b12 100644 --- a/retroshare-gui/src/TorControl/TorControlWindow.cpp +++ b/retroshare-gui/src/TorControl/TorControlWindow.cpp @@ -51,6 +51,11 @@ TorControlDialog::TorControlDialog(QWidget *) adjustSize(); } +TorControlDialog::~TorControlDialog() +{ + rsEvents->unregisterEventsHandler(mEventHandlerId); +} + void TorControlDialog::handleEvent_main_thread(std::shared_ptr event) { if(event->mType != RsEventType::TOR_MANAGER) return; diff --git a/retroshare-gui/src/TorControl/TorControlWindow.h b/retroshare-gui/src/TorControl/TorControlWindow.h index 7dc8c8bda..412c08ed5 100644 --- a/retroshare-gui/src/TorControl/TorControlWindow.h +++ b/retroshare-gui/src/TorControl/TorControlWindow.h @@ -15,6 +15,7 @@ class TorControlDialog: public QWidget, public Ui::TorControlDialog public: TorControlDialog(QWidget *parent =NULL); + virtual ~TorControlDialog(); enum TorStatus { TOR_STATUS_UNKNOWN = 0x00, From 1fafaeb909b83f76f1bcb11a92e4e49ea4f5a25f Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 16:00:02 +0100 Subject: [PATCH 2/8] Added delete of member TorControlSocket in destructor of TorControl --- libretroshare/src/tor/TorControl.cpp | 5 +++++ libretroshare/src/tor/TorControl.h | 1 + 2 files changed, 6 insertions(+) diff --git a/libretroshare/src/tor/TorControl.cpp b/libretroshare/src/tor/TorControl.cpp index d6d16355b..06d517efc 100644 --- a/libretroshare/src/tor/TorControl.cpp +++ b/libretroshare/src/tor/TorControl.cpp @@ -70,6 +70,11 @@ TorControl::TorControl() mSocket = new TorControlSocket(this); } +TorControl::~TorControl() +{ + delete(mSocket); +} + static RsTorConnectivityStatus torConnectivityStatus(Tor::TorControl::Status t) { switch(t) diff --git a/libretroshare/src/tor/TorControl.h b/libretroshare/src/tor/TorControl.h index 941c088d2..b15c4e047 100644 --- a/libretroshare/src/tor/TorControl.h +++ b/libretroshare/src/tor/TorControl.h @@ -68,6 +68,7 @@ public: }; explicit TorControl(); + virtual ~TorControl(); /* Information */ Status status() const; From 8d3046d157cb448debc3876d82d7567a6d451f92 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 16:08:20 +0100 Subject: [PATCH 3/8] Removed global variable "Tor::TorControl *torControl" --- libretroshare/src/tor/TorControl.cpp | 2 -- libretroshare/src/tor/TorControl.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/libretroshare/src/tor/TorControl.cpp b/libretroshare/src/tor/TorControl.cpp index 06d517efc..caf4576fa 100644 --- a/libretroshare/src/tor/TorControl.cpp +++ b/libretroshare/src/tor/TorControl.cpp @@ -46,8 +46,6 @@ #include "StrUtil.h" #include "PendingOperation.h" -Tor::TorControl *torControl = 0; - class nullstream: public std::ostream {}; static std::ostream& torctrldebug() diff --git a/libretroshare/src/tor/TorControl.h b/libretroshare/src/tor/TorControl.h index b15c4e047..568a1aaf2 100644 --- a/libretroshare/src/tor/TorControl.h +++ b/libretroshare/src/tor/TorControl.h @@ -149,5 +149,3 @@ private: }; } - -extern Tor::TorControl *torControl; From 97f7e0f93666671b7248df81ea74604c37ad9cf0 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 16:14:48 +0100 Subject: [PATCH 4/8] Added delete of TorControl in destructor of TorManagerPrivate --- libretroshare/src/tor/TorManager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libretroshare/src/tor/TorManager.cpp b/libretroshare/src/tor/TorManager.cpp index dc1f6e116..4e0a5986d 100644 --- a/libretroshare/src/tor/TorManager.cpp +++ b/libretroshare/src/tor/TorManager.cpp @@ -71,6 +71,7 @@ public: HiddenService *hiddenService ; explicit TorManagerPrivate(TorManager *parent = 0); + virtual ~TorManagerPrivate(); std::string torExecutablePath() const; bool createDataDir(const std::string &path); @@ -104,6 +105,11 @@ TorManagerPrivate::TorManagerPrivate(TorManager *parent) control->set_statusChanged_callback([this](int new_status,int /*old_status*/) { controlStatusChanged(new_status); }); } +TorManagerPrivate::~TorManagerPrivate() +{ + delete(control); +} + TorManager *TorManager::instance() { static TorManager *p = 0; From 02afc9062f03236b28866c628bef4fc204b1384d Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 16:31:30 +0100 Subject: [PATCH 5/8] Added delete of TorManagerPrivate in destructor of TorManager --- libretroshare/src/tor/TorManager.cpp | 5 +++++ libretroshare/src/tor/TorManager.h | 1 + 2 files changed, 6 insertions(+) diff --git a/libretroshare/src/tor/TorManager.cpp b/libretroshare/src/tor/TorManager.cpp index 4e0a5986d..bd768af68 100644 --- a/libretroshare/src/tor/TorManager.cpp +++ b/libretroshare/src/tor/TorManager.cpp @@ -95,6 +95,11 @@ TorManager::TorManager() { } +TorManager::~TorManager() +{ + delete(d); +} + TorManagerPrivate::TorManagerPrivate(TorManager *parent) : q(parent) , process(0) diff --git a/libretroshare/src/tor/TorManager.h b/libretroshare/src/tor/TorManager.h index 5a62f6d00..a96370bc7 100644 --- a/libretroshare/src/tor/TorManager.h +++ b/libretroshare/src/tor/TorManager.h @@ -51,6 +51,7 @@ class TorManager : public HiddenServiceClient, public RsThread, public RsTor { public: static TorManager *instance(); + virtual ~TorManager(); TorProcess *process(); TorControl *control(); From 72e52b998c7e7f9dbdc36d54be0217d959fe0fe6 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 16:41:46 +0100 Subject: [PATCH 6/8] Added check of shouldStop in RsThreadedTcpSocket::run --- libretroshare/src/pqi/rstcpsocket.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/pqi/rstcpsocket.cc b/libretroshare/src/pqi/rstcpsocket.cc index f42f100a2..f9bf03483 100644 --- a/libretroshare/src/pqi/rstcpsocket.cc +++ b/libretroshare/src/pqi/rstcpsocket.cc @@ -84,7 +84,7 @@ RsThreadedTcpSocket::RsThreadedTcpSocket() : RsTcpSocket() } void RsThreadedTcpSocket::run() { - while(connectionState() == CONNECTED) + while(!shouldStop() && connectionState() == CONNECTED) { tick(); std::this_thread::sleep_for(std::chrono::milliseconds(200)); From 72eb21bbca8600bc2bf4428878c52e60884bfd48 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 17:56:11 +0100 Subject: [PATCH 7/8] Use shutdownSync instead of shutdown in TorManager::run to stop tor --- libretroshare/src/tor/TorManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretroshare/src/tor/TorManager.cpp b/libretroshare/src/tor/TorManager.cpp index bd768af68..628f35733 100644 --- a/libretroshare/src/tor/TorManager.cpp +++ b/libretroshare/src/tor/TorManager.cpp @@ -462,7 +462,7 @@ void TorManager::run() std::this_thread::sleep_for(std::chrono::milliseconds(50)); } - d->control->shutdown(); + d->control->shutdownSync(); d->process->stop(); if(rsEvents) From 460dbdcdc82499317ff5d500d89290040d995c5e Mon Sep 17 00:00:00 2001 From: thunder2 Date: Wed, 29 Dec 2021 17:23:25 +0100 Subject: [PATCH 8/8] Added shutdown of tor management threads --- libretroshare/src/retroshare/rstor.h | 6 ++++++ libretroshare/src/tor/TorManager.cpp | 15 +++++++++++++-- retroshare-gui/src/main.cpp | 4 ++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/libretroshare/src/retroshare/rstor.h b/libretroshare/src/retroshare/rstor.h index 0ae966a7e..8eaa4a352 100644 --- a/libretroshare/src/retroshare/rstor.h +++ b/libretroshare/src/retroshare/rstor.h @@ -141,6 +141,12 @@ public: */ static bool start(); + /*! + * \brief stop + * Stop the Tor management threads. + */ + static void stop(); + /*! * \brief getHiddenServiceInfo * Gets information about the hidden service setup by RS to run. diff --git a/libretroshare/src/tor/TorManager.cpp b/libretroshare/src/tor/TorManager.cpp index 628f35733..ff2d53ced 100644 --- a/libretroshare/src/tor/TorManager.cpp +++ b/libretroshare/src/tor/TorManager.cpp @@ -53,6 +53,8 @@ using namespace Tor; +static TorManager *rsTor = nullptr; + namespace Tor { @@ -840,6 +842,17 @@ bool RsTor::start() return instance()->startTorManager(); } +void RsTor::stop() +{ + if (rsTor) { + if (rsTor->isRunning()) { + rsTor->fullstop(); + } + delete(rsTor); + rsTor= nullptr; + } +} + void RsTor::setTorDataDirectory(const std::string& dir) { instance()->setTorDataDirectory(dir); @@ -855,8 +868,6 @@ TorManager *RsTor::instance() assert(getpid() == syscall(SYS_gettid));// make sure we're not in a thread #endif - static TorManager *rsTor = nullptr; - if(rsTor == nullptr) rsTor = new TorManager; diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index d8818db0c..82d78d2b2 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -591,6 +591,10 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); RsGxsUpdateBroadcast::cleanup(); #endif + if (is_auto_tor) { + RsTor::stop(); + } + RsControl::instance()->rsGlobalShutDown(); delete(soundManager);