From e8c58270c45253143239f50d345b1786f864f7e2 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 15 Jun 2022 13:10:49 -0400 Subject: [PATCH] Populate router's buffer before sending RouterInfo block --- libi2pd/NetDb.cpp | 9 +++++++-- libi2pd/NetDb.hpp | 1 + libi2pd/SSU2Session.cpp | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/libi2pd/NetDb.cpp b/libi2pd/NetDb.cpp index 7cb11452..8566380a 100644 --- a/libi2pd/NetDb.cpp +++ b/libi2pd/NetDb.cpp @@ -977,8 +977,7 @@ namespace data if (router) { LogPrint (eLogDebug, "NetDb: Requested RouterInfo ", key, " found"); - if (!router->GetBuffer ()) - router->LoadBuffer (m_Storage.Path (router->GetIdentHashBase64 ())); + PopulateRouterInfoBuffer (router); if (router->GetBuffer ()) replyMsg = CreateDatabaseStoreMsg (router); } @@ -1433,5 +1432,11 @@ namespace data ++it; } } + + void NetDb::PopulateRouterInfoBuffer (std::shared_ptr r) + { + if (!r || r->GetBuffer ()) return; + r->LoadBuffer (m_Storage.Path (r->GetIdentHashBase64 ())); + } } } diff --git a/libi2pd/NetDb.hpp b/libi2pd/NetDb.hpp index 22fe693f..1a07903c 100644 --- a/libi2pd/NetDb.hpp +++ b/libi2pd/NetDb.hpp @@ -124,6 +124,7 @@ namespace data void ClearRouterInfos () { m_RouterInfos.clear (); }; std::shared_ptr NewRouterInfoBuffer () { return m_RouterInfoBuffersPool.AcquireSharedMt (); }; + void PopulateRouterInfoBuffer (std::shared_ptr r); uint32_t GetPublishReplyToken () const { return m_PublishReplyToken; }; diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 99dcf3fd..fba150d3 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1262,6 +1262,7 @@ namespace transport // send relay intro to Charlie auto r = i2p::data::netdb.FindRouter (GetRemoteIdentity ()->GetIdentHash ()); // Alice's RI + if (r) i2p::data::netdb.PopulateRouterInfoBuffer (r); uint8_t payload[SSU2_MAX_PAYLOAD_SIZE]; size_t payloadSize = r ? CreateRouterInfoBlock (payload, SSU2_MAX_PAYLOAD_SIZE - len - 32, r) : 0; if (!payloadSize && r) @@ -1370,6 +1371,7 @@ namespace transport uint8_t payload[SSU2_MAX_PAYLOAD_SIZE]; // Alice's RouterInfo auto r = i2p::data::netdb.FindRouter (GetRemoteIdentity ()->GetIdentHash ()); + if (r) i2p::data::netdb.PopulateRouterInfoBuffer (r); size_t payloadSize = r ? CreateRouterInfoBlock (payload, SSU2_MAX_PAYLOAD_SIZE - len - 32, r) : 0; if (!payloadSize && r) session->SendFragmentedMessage (CreateDatabaseStoreMsg (r)); @@ -1458,6 +1460,7 @@ namespace transport uint8_t payload[SSU2_MAX_PAYLOAD_SIZE]; // Charlie's RouterInfo auto r = i2p::data::netdb.FindRouter (GetRemoteIdentity ()->GetIdentHash ()); + if (r) i2p::data::netdb.PopulateRouterInfoBuffer (r); size_t payloadSize = r ? CreateRouterInfoBlock (payload, SSU2_MAX_PAYLOAD_SIZE - len - 32, r) : 0; if (!payloadSize && r) it->second.first->SendFragmentedMessage (CreateDatabaseStoreMsg (r)); @@ -1592,7 +1595,7 @@ namespace transport size_t SSU2Session::CreateRouterInfoBlock (uint8_t * buf, size_t len, std::shared_ptr r) { - if (!r || len < 5) return 0; + if (!r || !r->GetBuffer () || len < 5) return 0; buf[0] = eSSU2BlkRouterInfo; size_t size = r->GetBufferLen (); if (size + 5 < len)