From b3314380cce9d9cab6d4f699902fde43b18c795e Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 6 Jun 2024 14:19:30 -0400 Subject: [PATCH] don't use expired introducer even if we a session with it --- libi2pd/SSU2.cpp | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index 0a5574d5..769bb683 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -775,38 +775,41 @@ namespace transport auto address = session->GetAddress (); if (!address) return; session->WaitForIntroduction (); + auto ts = i2p::util::GetSecondsSinceEpoch (); + std::vector indices; int i = 0; // try to find existing session first for (auto& it: address->ssu->introducers) { - auto it1 = m_SessionsByRouterHash.find (it.iH); - if (it1 != m_SessionsByRouterHash.end ()) + if (it.iTag && ts < it.iExp) { - it1->second->Introduce (session, it.iTag); - return; - } + auto it1 = m_SessionsByRouterHash.find (it.iH); + if (it1 != m_SessionsByRouterHash.end ()) + { + it1->second->Introduce (session, it.iTag); + return; + } + else + indices.push_back(i); + } + i++; } // we have to start a new session to an introducer - auto ts = i2p::util::GetSecondsSinceEpoch (); std::shared_ptr r; uint32_t relayTag = 0; - if (!address->ssu->introducers.empty ()) + if (!indices.empty ()) { - std::vector indices; - for (int i = 0; i < (int)address->ssu->introducers.size (); i++) indices.push_back(i); if (indices.size () > 1) - std::shuffle (indices.begin(), indices.end(), std::mt19937(std::random_device()())); + std::shuffle (indices.begin(), indices.end(), std::mt19937(ts)); for (auto i: indices) { const auto& introducer = address->ssu->introducers[indices[i]]; - if (introducer.iTag && ts < introducer.iExp) + // introducer is not expired, because in indices + r = i2p::data::netdb.FindRouter (introducer.iH); + if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ())) { - r = i2p::data::netdb.FindRouter (introducer.iH); - if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ())) - { - relayTag = introducer.iTag; - if (relayTag) break; - } + relayTag = introducer.iTag; + if (relayTag) break; } } }