From 3cf0accd0abc5c833b7f4b2c163f45cfd9439d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Mon, 23 Oct 2023 09:45:32 -0400 Subject: [PATCH] connectionmanager: remove connecton if TLS negotiation fails If a TLS handshake was failing, the device information was not correctly removed, causing a connection to be detected and further communications to fail. So, while monitoring, some connections were stuck in "Connecting TLS". Moreover, remove waitForReady because it's unused Change-Id: I8350d7f8731311ab46db78fb26328edc0dcb31dc --- include/tls_session.h | 2 -- src/connectionmanager.cpp | 7 +++++++ src/peer_connection.cpp | 9 --------- src/peer_connection.h | 2 -- src/security/tls_session.cpp | 18 ------------------ 5 files changed, 7 insertions(+), 31 deletions(-) diff --git a/include/tls_session.h b/include/tls_session.h index d0adb63..4483787 100644 --- a/include/tls_session.h +++ b/include/tls_session.h @@ -133,8 +133,6 @@ public: int maxPayload() const override; - void waitForReady(const duration& timeout = {}); - /// Synchronous writing. /// Return a positive number for number of bytes write, or 0 and \a ec set in case of error. std::size_t write(const ValueType* data, std::size_t size, std::error_code& ec) override; diff --git a/src/connectionmanager.cpp b/src/connectionmanager.cpp index 68f40b1..7c3c8d2 100644 --- a/src/connectionmanager.cpp +++ b/src/connectionmanager.cpp @@ -1185,6 +1185,13 @@ ConnectionManager::Impl::onTlsNegotiationDone(const std::shared_ptr<DeviceInfo>& vid); dinfo->executePendingOperations(vid, nullptr); } + + std::unique_lock<std::mutex> lk(dinfo->mtx_); + dinfo->info.erase(vid); + + if (dinfo->empty()) { + infos_.removeDeviceInfo(dinfo->deviceId); + } } else { // The socket is ready, store it if (isDhtRequest) { diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 1c8ae3e..3fbd820 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -382,15 +382,6 @@ TlsSocketEndpoint::peerCertificate() const return pimpl_->tls->peerCertificate(); } -void -TlsSocketEndpoint::waitForReady(const std::chrono::milliseconds& timeout) -{ - if (!pimpl_->tls) { - return; - } - pimpl_->tls->waitForReady(timeout); -} - int TlsSocketEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { diff --git a/src/peer_connection.h b/src/peer_connection.h index c6f0197..7d91d04 100644 --- a/src/peer_connection.h +++ b/src/peer_connection.h @@ -123,8 +123,6 @@ public: } int waitForData(std::chrono::milliseconds timeout, std::error_code&) const override; - void waitForReady(const std::chrono::milliseconds& timeout = {}); - void setOnStateChange(OnStateChangeCb&& cb); void setOnReady(OnReadyCb&& cb); diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp index de0347f..1d7b24d 100644 --- a/src/security/tls_session.cpp +++ b/src/security/tls_session.cpp @@ -1737,24 +1737,6 @@ TlsSession::read(ValueType* data, std::size_t size, std::error_code& ec) return 0; } -void -TlsSession::waitForReady(const duration& timeout) -{ - auto ready = [this]() -> bool { - auto state = pimpl_->state_.load(); - return state == TlsSessionState::ESTABLISHED or state == TlsSessionState::SHUTDOWN; - }; - std::unique_lock<std::mutex> lk(pimpl_->stateMutex_); - if (timeout == duration::zero()) - pimpl_->stateCondition_.wait(lk, ready); - else - pimpl_->stateCondition_.wait_for(lk, timeout, ready); - - if (!ready()) - throw std::logic_error("Invalid state in TlsSession::waitForReady: " - + std::to_string((int) pimpl_->state_.load())); -} - int TlsSession::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { -- GitLab