diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/daemon/HTTPServer.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/daemon/HTTPServer.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/daemon/HTTPServer.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/daemon/HTTPServer.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -442,5 +442,5 @@ std::string webroot; i2p::config::GetOption("http.webroot", webroot); s << "" << tr("Local Destinations") << ":
\r\n
\r\n"; - for (auto& it: i2p::client::context.GetDestinationsList ()) + for (auto& it: i2p::client::context.GetDestinations ()) { auto ident = it.second->GetIdentHash (); @@ -451,9 +451,8 @@ auto i2cpServer = i2p::client::context.GetI2CPServer (); - auto i2cpSessions = i2cpServer ? i2cpServer->GetSessionsList () : std::vector > > (); - if (!i2cpSessions.empty ()) + if (i2cpServer && !(i2cpServer->GetSessions ().empty ())) { s << "
I2CP "<< tr("Local Destinations") << ":
\r\n
\r\n"; - for (auto& it: i2cpSessions) + for (auto& it: i2cpServer->GetSessions ()) { auto dest = it.second->GetDestination (); @@ -526,13 +525,13 @@ << "" << tr("EncType") << "" << "\r\n"; - for(auto& it: dest->GetLeaseSetsList ()) + for(auto& it: dest->GetLeaseSets ()) { s << "" - << "" << it->GetIdentHash ().ToBase32 () << "" + << "" << it.first.ToBase32 () << "" << "" - << "" << (int)it->GetStoreType () << ""; - if (!it->IsIncompatibleCrypto ()) - s << "" << (int)it->GetEncryptionType () <<""; + << "&lease=" << it.first.ToBase32 () << "&token=" << token << "\" title=\"" << tr("Expire LeaseSet") << "\"> ✘ " + << "" << (int)it.second->GetStoreType () << ""; + if (!it.second->IsIncompatibleCrypto ()) + s << "" << (int)it.second->GetEncryptionType () <<""; else s << "n/a"; @@ -548,5 +547,5 @@ { s << "" << tr("Inbound tunnels") << ":
\r\n
\r\n"; - for (auto & it : pool->GetInboundTunnelsList ()) { + for (auto & it : pool->GetInboundTunnels ()) { s << "
"; // for each tunnel hop if not zero-hop @@ -570,5 +569,5 @@ s << "
\r\n
\r\n"; s << "" << tr("Outbound tunnels") << ":
\r\n
\r\n"; - for (auto & it : pool->GetOutboundTunnelsList ()) { + for (auto & it : pool->GetOutboundTunnels ()) { s << "
"; s << it->GetTunnelID () << ":me ⇒"; @@ -596,8 +595,7 @@ s << "" << tr("Tags") << "
\r\n" << tr("Incoming") << ": " << dest->GetNumIncomingTags () << "
\r\n"; - auto sessionsList = dest->GetSessionsList (); - if (!sessionsList.empty ()) { + if (!dest->GetSessions ().empty ()) { std::stringstream tmp_s; uint32_t out_tags = 0; - for (const auto& it: sessionsList) { + for (const auto& it: dest->GetSessions ()) { tmp_s << "" << i2p::client::context.GetAddressBook ().ToAddress(it.first) << "" << it.second->GetNumOutgoingTags () << "\r\n"; out_tags += it.second->GetNumOutgoingTags (); @@ -616,10 +614,9 @@ if (numECIESx25519Tags > 0) { s << "ECIESx25519
\r\n" << tr("Incoming Tags") << ": " << numECIESx25519Tags << "
\r\n"; - auto eciesSessionsList = dest->GetECIESx25519SessionsList ().get (); - if (!eciesSessionsList.empty ()) + if (!dest->GetECIESx25519Sessions ().empty ()) { std::stringstream tmp_s; uint32_t ecies_sessions = 0; - for (const auto& it: eciesSessionsList) { - tmp_s << "" << i2p::client::context.GetAddressBook ().ToAddress(it->GetDestination ()) << "" << it->GetState () << "\r\n"; + for (const auto& it: dest->GetECIESx25519Sessions ()) { + tmp_s << "" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetDestination ()) << "" << it.second->GetState () << "\r\n"; ecies_sessions++; } @@ -701,7 +698,7 @@ { s << "I2CP " << tr("Local Destination") << ":
\r\n
\r\n"; - auto session = i2cpServer->FindSessionByID ((uint16_t)std::stoi (id)); - if (session) - ShowLeaseSetDestination (s, session->GetDestination (), 0); + auto it = i2cpServer->GetSessions ().find (std::stoi (id)); + if (it != i2cpServer->GetSessions ().end ()) + ShowLeaseSetDestination (s, it->second->GetDestination (), 0); else ShowError(s, tr("I2CP session not found")); @@ -781,5 +778,5 @@ s << "" << tr("Inbound tunnels") << ":
\r\n
\r\n"; - for (auto & it : i2p::tunnel::tunnels.GetInboundTunnelsList ()) { + for (auto & it : i2p::tunnel::tunnels.GetInboundTunnels ()) { s << "
"; if (it->GetNumHops ()) @@ -802,5 +799,5 @@ s << "
\r\n
\r\n"; s << "" << tr("Outbound tunnels") << ":
\r\n
\r\n"; - for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnelsList ()) { + for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnels ()) { s << "
"; s << it->GetTunnelID () << ":me ⇒"; @@ -904,5 +901,5 @@ s << "⇒ID⇒" << tr("Amount") << "" << tr("Next") << "\r\n"; s << "\r\n"; - for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnelsList ()) + for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ()) { s << ""; @@ -1038,9 +1035,8 @@ } - auto samSessions = sam->GetSessionsList (); - if (samSessions.size ()) + if (sam->GetSessions ().size ()) { s << "" << tr("SAM sessions") << ":
\r\n
\r\n"; - for (auto& it: samSessions) + for (auto& it: sam->GetSessions ()) { auto& name = it.second->GetLocalDestination ()->GetNickname (); diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/daemon/I2PControlHandlers.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/daemon/I2PControlHandlers.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/daemon/I2PControlHandlers.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/daemon/I2PControlHandlers.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -236,5 +236,5 @@ void I2PControlHandlers::TunnelsParticipatingHandler (std::ostringstream& results) { - int transit = i2p::tunnel::tunnels.CountTransitTunnels (); + int transit = i2p::tunnel::tunnels.GetTransitTunnels ().size (); InsertParam (results, "i2p.router.net.tunnels.participating", transit); } @@ -469,5 +469,5 @@ pt.put("enabled", true); boost::property_tree::ptree sam_sessions; - for (auto& it: sam->GetSessionsList ()) + for (auto& it: sam->GetSessions ()) { boost::property_tree::ptree sam_session, sam_session_sockets; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Destination.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Destination.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Destination.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Destination.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -672,5 +672,5 @@ if (!outbound || !inbound) { - if (m_Pool->HasInboundTunnels () && m_Pool->HasOutboundTunnels ()) + if (!m_Pool->GetInboundTunnels ().empty () && !m_Pool->GetOutboundTunnels ().empty ()) { LogPrint (eLogInfo, "Destination: No compatible tunnels with ", floodfill->GetIdentHash ().ToBase64 (), ". Trying another floodfill"); diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Destination.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Destination.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Destination.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Destination.h 2026-08-24 17:04:06.000000000 +0000 @@ -20,5 +20,4 @@ #include #include -#include #include #include "Identity.h" @@ -143,5 +142,5 @@ ~LeaseSetDestination (); const std::string& GetNickname () const { return m_Nickname; }; - auto& GetService () const { return m_Service; }; + auto& GetService () { return m_Service; }; virtual void Start (); @@ -152,5 +151,5 @@ std::shared_ptr GetTunnelPool () { return m_Pool; }; - bool IsReady () const { return m_LeaseSet && !m_LeaseSet->IsExpired () && m_Pool->HasOutboundTunnels (); }; + bool IsReady () const { return m_LeaseSet && !m_LeaseSet->IsExpired () && m_Pool->GetOutboundTunnels ().size () > 0; }; std::shared_ptr FindLeaseSet (const i2p::data::IdentHash& ident); bool RequestDestination (const i2p::data::IdentHash& dest, RequestComplete requestComplete = nullptr); @@ -236,5 +235,6 @@ // for HTTP only - int GetNumRemoteLeaseSets () const { std::lock_guard lock(m_RemoteLeaseSetsMutex); return m_RemoteLeaseSets.size (); }; + int GetNumRemoteLeaseSets () const { return m_RemoteLeaseSets.size (); }; + const decltype(m_RemoteLeaseSets)& GetLeaseSets () const { return m_RemoteLeaseSets; }; // copy for other threads, unlike GetLeaseSets which hands out the container itself std::vector > GetLeaseSetsList () const @@ -249,9 +249,4 @@ bool IsEncryptedLeaseSet () const { return m_LeaseSetType == i2p::data::NETDB_STORE_TYPE_ENCRYPTED_LEASESET2; }; bool IsPerClientAuth () const { return m_AuthType > 0; }; - std::future > GetECIESx25519SessionsList () const - { - return boost::asio::post (GetService (), - boost::asio::use_future ([this]() { return GetECIESx25519SessionsListSync (); })); - } }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Garlic.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Garlic.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Garlic.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Garlic.h 2026-08-24 17:04:06.000000000 +0000 @@ -13,6 +13,4 @@ #include #include -#include -#include #include #include @@ -322,5 +320,5 @@ // outgoing sessions int m_NumTags; - mutable std::mutex m_SessionsMutex; + std::mutex m_SessionsMutex; std::unordered_map m_Sessions; std::unordered_map, ECIESX25519AEADRatchetSessionPtr> m_ECIESx25519Sessions; // static key -> session @@ -344,21 +342,6 @@ size_t GetNumIncomingTags () const { return m_Tags.size (); } size_t GetNumIncomingECIESx25519Tags () const { return m_ECIESx25519Tags.size (); } - // thread-safe snapshots, safe to iterate without holding any lock - std::vector > GetSessionsList () const - { - std::unique_lock l(m_SessionsMutex); - return std::vector > (m_Sessions.begin (), m_Sessions.end ()); - } - - protected: - - std::vector GetECIESx25519SessionsListSync () const - { - std::vector sessions; - sessions.reserve (m_ECIESx25519Sessions.size ()); - for (const auto& it: m_ECIESx25519Sessions) - sessions.push_back (it.second); - return sessions; - } + const decltype(m_Sessions)& GetSessions () const { return m_Sessions; }; + const decltype(m_ECIESx25519Sessions)& GetECIESx25519Sessions () const { return m_ECIESx25519Sessions; } }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TransitTunnel.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TransitTunnel.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TransitTunnel.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TransitTunnel.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -223,5 +223,4 @@ m_Thread = nullptr; } - std::lock_guard l(m_TransitTunnelsMutex); m_TransitTunnels.clear (); } @@ -638,8 +637,5 @@ { if (tunnels.AddTunnel (tunnel)) - { - std::lock_guard l(m_TransitTunnelsMutex); m_TransitTunnels.push_back (tunnel); - } else { @@ -652,5 +648,4 @@ void TransitTunnels::ManageTransitTunnels (uint64_t ts) { - std::lock_guard l(m_TransitTunnelsMutex); for (auto it = m_TransitTunnels.begin (); it != m_TransitTunnels.end ();) { @@ -676,5 +671,5 @@ int timeout = 0; uint32_t ts = i2p::util::GetSecondsSinceEpoch (); - std::lock_guard l(m_TransitTunnelsMutex); + // TODO: possible race condition with I2PControl for (const auto& it : m_TransitTunnels) { diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TransitTunnel.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TransitTunnel.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TransitTunnel.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TransitTunnel.h 2026-08-24 17:04:06.000000000 +0000 @@ -12,5 +12,4 @@ #include #include -#include #include #include @@ -139,5 +138,5 @@ void PostTransitTunnelBuildMsg (std::shared_ptr&& msg); - size_t GetNumTransitTunnels () const { std::lock_guard l(m_TransitTunnelsMutex); return m_TransitTunnels.size (); } + size_t GetNumTransitTunnels () const { return m_TransitTunnels.size (); } int GetTransitTunnelsExpirationTimeout (); @@ -157,5 +156,4 @@ volatile bool m_IsRunning; std::unique_ptr m_Thread; - mutable std::mutex m_TransitTunnelsMutex; std::list > m_TransitTunnels; i2p::util::Queue > m_TunnelBuildMsgQueue; @@ -164,10 +162,6 @@ public: - // for HTTP and I2PControl; thread-safe snapshot, safe to iterate without holding any lock - std::vector > GetTransitTunnelsList () const - { - std::lock_guard l(m_TransitTunnelsMutex); - return std::vector > (m_TransitTunnels.begin (), m_TransitTunnels.end ()); - } + // for HTTP only + const auto& GetTransitTunnels () const { return m_TransitTunnels; }; size_t GetTunnelBuildMsgQueueSize () const { return m_TunnelBuildMsgQueue.GetSize (); }; }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Tunnel.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Tunnel.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Tunnel.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Tunnel.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -889,8 +889,5 @@ pool->TunnelExpired (tunnel); // we don't have outbound tunnels in m_Tunnels - { - std::lock_guard l(m_TunnelsMutex); - it = m_OutboundTunnels.erase (it); - } + it = m_OutboundTunnels.erase (it); } else @@ -943,8 +940,5 @@ pool->TunnelExpired (tunnel); RemoveTunnel (tunnel->GetTunnelID ()); - { - std::lock_guard l(m_TunnelsMutex); - it = m_InboundTunnels.erase (it); - } + it = m_InboundTunnels.erase (it); } else @@ -1068,8 +1062,5 @@ { // we don't need to insert it to m_Tunnels - { - std::lock_guard l(m_TunnelsMutex); - m_OutboundTunnels.push_back (newTunnel); - } + m_OutboundTunnels.push_back (newTunnel); auto pool = newTunnel->GetTunnelPool (); if (pool && pool->IsActive ()) @@ -1083,8 +1074,5 @@ if (AddTunnel (newTunnel)) { - { - std::lock_guard l(m_TunnelsMutex); - m_InboundTunnels.push_back (newTunnel); - } + m_InboundTunnels.push_back (newTunnel); auto pool = newTunnel->GetTunnelPool (); if (!pool) @@ -1113,8 +1101,5 @@ inboundTunnel->SetTunnelPool (pool); inboundTunnel->SetState (eTunnelStateEstablished); - { - std::lock_guard l(m_TunnelsMutex); - m_InboundTunnels.push_back (inboundTunnel); - } + m_InboundTunnels.push_back (inboundTunnel); AddTunnel (inboundTunnel); return inboundTunnel; @@ -1126,8 +1111,5 @@ outboundTunnel->SetTunnelPool (pool); outboundTunnel->SetState (eTunnelStateEstablished); - { - std::lock_guard l(m_TunnelsMutex); - m_OutboundTunnels.push_back (outboundTunnel); - } + m_OutboundTunnels.push_back (outboundTunnel); // we don't insert into m_Tunnels return outboundTunnel; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Tunnel.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Tunnel.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Tunnel.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Tunnel.h 2026-08-24 17:04:06.000000000 +0000 @@ -328,16 +328,8 @@ public: - // for HTTP only; thread-safe snapshots, safe to iterate without holding any lock - std::vector > GetOutboundTunnelsList () const - { - std::lock_guard l(m_TunnelsMutex); - return std::vector > (m_OutboundTunnels.begin (), m_OutboundTunnels.end ()); - } - std::vector > GetInboundTunnelsList () const - { - std::lock_guard l(m_TunnelsMutex); - return std::vector > (m_InboundTunnels.begin (), m_InboundTunnels.end ()); - } - auto GetTransitTunnelsList () const { return m_TransitTunnels.GetTransitTunnelsList (); }; + // for HTTP only + const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; }; + const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; }; + const auto& GetTransitTunnels () const { return m_TransitTunnels.GetTransitTunnels (); }; size_t CountTransitTunnels() const; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TunnelPool.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TunnelPool.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TunnelPool.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TunnelPool.h 2026-08-24 17:04:06.000000000 +0000 @@ -162,26 +162,7 @@ public: - bool HasOutboundTunnels () const - { - std::unique_lock l(m_OutboundTunnelsMutex); - return !m_OutboundTunnels.empty (); - } - bool HasInboundTunnels () const - { - std::unique_lock l(m_InboundTunnelsMutex); - return !m_InboundTunnels.empty (); - } - - // for HTTP only; thread-safe snapshots, safe to iterate without holding any lock - std::vector > GetOutboundTunnelsList () const - { - std::unique_lock l(m_OutboundTunnelsMutex); - return std::vector > (m_OutboundTunnels.begin (), m_OutboundTunnels.end ()); - } - std::vector > GetInboundTunnelsList () const - { - std::unique_lock l(m_InboundTunnelsMutex); - return std::vector > (m_InboundTunnels.begin (), m_InboundTunnels.end ()); - } + // for HTTP only + const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; }; + const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; }; }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/ClientContext.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/ClientContext.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/ClientContext.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/ClientContext.h 2026-08-24 17:04:06.000000000 +0000 @@ -12,6 +12,4 @@ #include #include -#include -#include #include #include @@ -157,5 +155,5 @@ private: - mutable std::mutex m_DestinationsMutex; + std::mutex m_DestinationsMutex; std::map > m_Destinations; std::shared_ptr m_SharedLocalDestination; @@ -185,10 +183,6 @@ public: - // for HTTP; thread-safe snapshot, safe to iterate without holding any lock - std::vector > > GetDestinationsList () const - { - std::lock_guard l(m_DestinationsMutex); - return std::vector > > (m_Destinations.begin (), m_Destinations.end ()); - } + // for HTTP + const decltype(m_Destinations)& GetDestinations () const { return m_Destinations; }; const decltype(m_ClientTunnels)& GetClientTunnels () const { return m_ClientTunnels; }; const decltype(m_ServerTunnels)& GetServerTunnels () const { return m_ServerTunnels; }; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/I2CP.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/I2CP.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/I2CP.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/I2CP.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -164,9 +164,4 @@ i2p::garlic::ECIESX25519AEADRatchetSession * from) { - if (len < 4) - { - LogPrint (eLogWarning, "I2CP: data message is too short ", len); - return; - } uint32_t length = bufbe32toh (buf); if (length > len - 4) length = len - 4; @@ -189,5 +184,5 @@ m_ReadinessCheckTimer.cancel (); auto pool = GetTunnelPool (); - if (!pool || !pool->HasOutboundTunnels ()) + if (!pool || pool->GetOutboundTunnels ().empty ()) { // try again later @@ -1199,8 +1194,5 @@ decltype(m_Sessions) sessions; - { - std::lock_guard l(m_SessionsMutex); - m_Sessions.swap (sessions); - } + m_Sessions.swap (sessions); for (auto& it: sessions) it.second->Stop (); @@ -1242,5 +1234,4 @@ { if (!session) return false; - std::lock_guard l(m_SessionsMutex); if (!m_Sessions.insert({session->GetSessionID (), session}).second) { @@ -1253,5 +1244,4 @@ void I2CPServer::RemoveSession (uint16_t sessionID) { - std::lock_guard l(m_SessionsMutex); m_Sessions.erase (sessionID); } @@ -1259,5 +1249,4 @@ std::shared_ptr I2CPServer::FindSessionByIdentHash (const i2p::data::IdentHash& ident) const { - std::lock_guard l(m_SessionsMutex); for (const auto& it: m_Sessions) { diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/I2CP.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/I2CP.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/I2CP.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/I2CP.h 2026-08-24 17:04:06.000000000 +0000 @@ -18,6 +18,4 @@ #include #include -#include -#include #include #include "util.h" @@ -250,5 +248,4 @@ bool m_IsSingleThread; I2CPMessageHandler m_MessagesHandlers[256]; - mutable std::mutex m_SessionsMutex; std::map > m_Sessions; @@ -259,16 +256,6 @@ const decltype(m_MessagesHandlers)& GetMessagesHandlers () const { return m_MessagesHandlers; }; - // for HTTP; thread-safe snapshot, safe to iterate without holding any lock - std::vector > > GetSessionsList () const - { - std::lock_guard l(m_SessionsMutex); - return std::vector > > (m_Sessions.begin (), m_Sessions.end ()); - } - std::shared_ptr FindSessionByID (uint16_t sessionID) const - { - std::lock_guard l(m_SessionsMutex); - auto it = m_Sessions.find (sessionID); - return it != m_Sessions.end () ? it->second : nullptr; - } + // for HTTP + const decltype(m_Sessions)& GetSessions () const { return m_Sessions; }; }; } diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/SAM.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/SAM.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/SAM.cpp 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/SAM.cpp 2026-08-24 17:04:06.000000000 +0000 @@ -1688,5 +1688,4 @@ { if (!session) return false; - std::unique_lock l(m_SessionsMutex); auto ret = m_Sessions.emplace (session->Name, session); return ret.second; diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/SAM.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/SAM.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/SAM.h 2026-08-24 17:07:51.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/SAM.h 2026-08-24 17:04:06.000000000 +0000 @@ -16,6 +16,4 @@ #include #include -#include -#include #include #include @@ -322,10 +320,6 @@ public: - // for HTTP; thread-safe snapshot, safe to iterate without holding any lock - std::vector > > GetSessionsList () const - { - std::unique_lock l(m_SessionsMutex); - return std::vector > > (m_Sessions.begin (), m_Sessions.end ()); - } + // for HTTP + const decltype(m_Sessions)& GetSessions () const { return m_Sessions; }; }; }