From ff8941af71192a4440aba748ac434734dcb718ad Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 27 Jun 2024 18:02:17 -0400 Subject: [PATCH] check if address is still introducer before trying to introduce --- libi2pd/SSU2.cpp | 14 +++++++++----- libi2pd/SSU2Session.cpp | 14 +++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index d19131c4..7cd6854e 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -785,8 +785,12 @@ namespace transport auto it1 = m_SessionsByRouterHash.find (it.iH); if (it1 != m_SessionsByRouterHash.end ()) { - it1->second->Introduce (session, it.iTag); - return; + auto addr = it1->second->GetAddress (); + if (addr && addr->IsIntroducer ()) + { + it1->second->Introduce (session, it.iTag); + return; + } } else indices.push_back(i); @@ -815,12 +819,12 @@ namespace transport { relayTag = introducer.iTag; addr = address->IsV6 () ? r->GetSSU2V6Address () : r->GetSSU2V4Address (); - if (addr && !addr->host.is_unspecified () && addr->port && + if (addr && addr->IsIntroducer () && !addr->host.is_unspecified () && addr->port && !i2p::transport::transports.IsInReservedRange(addr->host)) break; else { - // address is invalid try another SSU2 address if exists + // address is invalid or not intrudcer, try another SSU2 address if exists if (address->IsV4 ()) { if (i2p::context.SupportsV6 ()) @@ -831,7 +835,7 @@ namespace transport if (i2p::context.SupportsV4 ()) addr = r->GetSSU2V4Address (); } - if (addr && !addr->host.is_unspecified () && addr->port && + if (addr && addr->IsIntroducer () && !addr->host.is_unspecified () && addr->port && !i2p::transport::transports.IsInReservedRange(addr->host)) break; else diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 51e328b6..c00c5a18 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1125,6 +1125,13 @@ namespace transport LogPrint (eLogError, "SSU2: RouterInfo in SessionConfirmed is from future for ", (ri->GetTimestamp () - ts)/1000LL, " seconds"); return false; } + // update RouterInfo in netdb + ri = i2p::data::netdb.AddRouterInfo (ri->GetBuffer (), ri->GetBufferLen ()); // ri points to one from netdb now + if (!ri) + { + LogPrint (eLogError, "SSU2: Couldn't update RouterInfo from SessionConfirmed in netdb"); + return false; + } m_Address = m_RemoteEndpoint.address ().is_v6 () ? ri->GetSSU2V6Address () : ri->GetSSU2V4Address (); if (!m_Address || memcmp (S, m_Address->s, 32)) { @@ -1139,13 +1146,6 @@ namespace transport " and actual endpoint ", m_RemoteEndpoint.address (), " from ", i2p::data::GetIdentHashAbbreviation (ri->GetIdentHash ())); return false; } - // update RouterInfo in netdb - ri = i2p::data::netdb.AddRouterInfo (ri->GetBuffer (), ri->GetBufferLen ()); // ri points to one from netdb now - if (!ri) - { - LogPrint (eLogError, "SSU2: Couldn't update RouterInfo from SessionConfirmed in netdb"); - return false; - } SetRemoteIdentity (ri->GetRouterIdentity ()); AdjustMaxPayloadSize (); m_Server.AddSessionByRouterHash (shared_from_this ()); // we know remote router now