From efe2ec03ff9575af403a19cde2b4e1c42a749763 Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 28 Dec 2021 18:29:33 +0100 Subject: [PATCH] fixed a few bugs that may cause the bootstrap process to hang --- libretroshare/src/tor/TorControl.cpp | 28 ++++++++++------------ libretroshare/src/tor/TorControlSocket.cpp | 8 ++++++- libretroshare/src/tor/TorManager.cpp | 5 ++++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/libretroshare/src/tor/TorControl.cpp b/libretroshare/src/tor/TorControl.cpp index 5da312613..d6d16355b 100644 --- a/libretroshare/src/tor/TorControl.cpp +++ b/libretroshare/src/tor/TorControl.cpp @@ -65,14 +65,9 @@ static std::ostream& torctrldebug() using namespace Tor; TorControl::TorControl() - : mControlPort(0),mSocksPort(0),mStatus(NotConnected), mTorStatus(TorOffline),mHasOwnership(false) + : mControlPort(0),mSocksPort(0),mStatus(NotConnected), mTorStatus(TorUnknown),mHasOwnership(false) { mSocket = new TorControlSocket(this); - mControlPort = 0; - mSocksPort = 0; - mStatus = NotConnected; - mTorStatus = TorUnknown; - mHasOwnership = false; } static RsTorConnectivityStatus torConnectivityStatus(Tor::TorControl::Status t) @@ -127,6 +122,7 @@ void TorControl::setTorStatus(TorControl::TorStatus n) if (n == mTorStatus) return; + RsDbg() << "Setting TorStatus=" << n ; mTorStatus = n; if(rsEvents) @@ -216,7 +212,10 @@ void TorControl::connect(const std::string &address, uint16_t port) setStatus(Connecting); if(mSocket->connectToHost(address, port)) + { setStatus(SocketConnected); + setTorStatus(TorOffline); // connected and running, but not yet ready + } } void TorControl::reconnect() @@ -246,8 +245,6 @@ void TorControl::authenticateReply(TorControlCommand *sender) torCtrlDebug() << "torctrl: Authentication successful" << std::endl; setStatus(TorControl::Authenticated); - setTorStatus(TorControl::TorUnknown); - TorControlCommand *clientEvents = new TorControlCommand; clientEvents->set_replyLine_callback([this](int code, const ByteArray &data) { statusEvent(code,data);}); @@ -442,8 +439,8 @@ void TorControl::getTorInfoReply(TorControlCommand *sender) torCtrlDebug() << "torctrl: Tor indicates that circuits have been established; state is TorReady" << std::endl; setTorStatus(TorControl::TorReady); } - else - setTorStatus(TorControl::TorOffline); +// else +// setTorStatus(TorControl::TorOffline); auto bootstrap = command->get("status/bootstrap-phase"); if (!bootstrap.empty()) @@ -562,14 +559,15 @@ void TorControl::statusEvent(int /* code */, const ByteArray &data) if (tokens.size() < 3) return; - torCtrlDebug() << "torctrl: status event:" << data.trimmed().toString() << std::endl; - const ByteArray& tok2 = *(++tokens.begin()); + const ByteArray& tok2 = *(++(++tokens.begin())); + torCtrlDebug() << "torctrl: status event:" << data.trimmed().toString() << " tok2=\"" << tok2.toString() << "\"" << std::endl; - if (tok2 == "CIRCUIT_ESTABLISHED") { + if (tok2 == "CIRCUIT_ESTABLISHED") setTorStatus(TorControl::TorReady); - } else if (tok2 == "CIRCUIT_NOT_ESTABLISHED") { + else if (tok2 == "CIRCUIT_NOT_ESTABLISHED") setTorStatus(TorControl::TorOffline); - } else if (tok2 == "BOOTSTRAP") { + else if (tok2 == "BOOTSTRAP") + { tokens.pop_front(); updateBootstrap(tokens); } diff --git a/libretroshare/src/tor/TorControlSocket.cpp b/libretroshare/src/tor/TorControlSocket.cpp index e9740515a..19b373f67 100644 --- a/libretroshare/src/tor/TorControlSocket.cpp +++ b/libretroshare/src/tor/TorControlSocket.cpp @@ -51,7 +51,7 @@ bool TorControlSocket::connectToHost(const std::string& tcp_address,uint16_t tcp { if(RsTcpSocket::connect(tcp_address,tcp_port)) { - start(); + start("TorControlSocket"); return true; } else @@ -131,6 +131,12 @@ void TorControlSocket::process() ByteArray line = readline(5120); + if(line.empty()) // This happens when the incoming buffer isn't empty yet doesn't have a full line already. + { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + continue; + } + if (!line.endsWith(ByteArray("\r\n"))) { setError("Invalid control message syntax"); return; diff --git a/libretroshare/src/tor/TorManager.cpp b/libretroshare/src/tor/TorManager.cpp index 7b4a80363..dc1f6e116 100644 --- a/libretroshare/src/tor/TorManager.cpp +++ b/libretroshare/src/tor/TorManager.cpp @@ -502,6 +502,11 @@ void TorManager::threadTick() break; case TorControl::HiddenServiceReady: + if(d->control->torStatus() < TorControl::TorReady) + { + d->control->getTorInfo(); // forces TorControl to check its state. + std::this_thread::sleep_for(std::chrono::seconds(1)); + } break; case TorControl::Error: