From 481fafc11d7b105a7a91274bd617ae4380a6c734 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 9 Feb 2016 15:27:23 -0500 Subject: [PATCH] invalidate excluded leases --- LeaseSet.cpp | 35 +++++++++++++++++++++++++++-------- LeaseSet.h | 20 +++++++++++++++----- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/LeaseSet.cpp b/LeaseSet.cpp index 6beec5ab..921941b1 100644 --- a/LeaseSet.cpp +++ b/LeaseSet.cpp @@ -69,7 +69,6 @@ namespace data void LeaseSet::Update (const uint8_t * buf, size_t len) { - m_Leases.clear (); if (len > m_BufferLen) { auto oldBuffer = m_Buffer; @@ -84,7 +83,6 @@ namespace data void LeaseSet::PopulateLeases () { m_StoreLeases = true; - m_Leases.clear (); ReadFromBuffer (false); } @@ -112,6 +110,13 @@ namespace data return; } + // reset existing leases + if (m_StoreLeases) + for (auto it: m_Leases) + it->isUpdated = false; + else + m_Leases.clear (); + // process leases m_ExpirationTime = 0; const uint8_t * leases = m_Buffer + size; @@ -128,9 +133,9 @@ namespace data m_ExpirationTime = lease.endDate; if (m_StoreLeases) { - auto l = std::make_shared(); - *l = lease; - m_Leases.push_back (l); + auto ret = m_Leases.insert (std::make_shared(lease)); + if (!ret.second) *(*ret.first) = lease; // update existing + (*ret.first)->isUpdated = true; // check if lease's gateway is in our netDb if (!netdb.FindRouter (lease.tunnelGateway)) { @@ -140,7 +145,21 @@ namespace data } } } - + // delete old leases + if (m_StoreLeases) + { + for (auto it = m_Leases.begin (); it != m_Leases.end ();) + { + if (!(*it)->isUpdated) + { + (*it)->endDate = 0; // somebody might still hold it + m_Leases.erase (it++); + } + else + it++; + } + } + // verify if (!m_Identity->Verify (m_Buffer, leases - m_Buffer, leases)) { @@ -153,7 +172,7 @@ namespace data { auto ts = i2p::util::GetMillisecondsSinceEpoch (); std::vector > leases; - for (auto& it: m_Leases) + for (auto it: m_Leases) { auto endDate = it->endDate; if (!withThreshold) @@ -167,7 +186,7 @@ namespace data bool LeaseSet::HasExpiredLeases () const { auto ts = i2p::util::GetMillisecondsSinceEpoch (); - for (auto& it: m_Leases) + for (auto it: m_Leases) if (ts >= it->endDate) return true; return false; } diff --git a/LeaseSet.h b/LeaseSet.h index 027fb948..b9607494 100644 --- a/LeaseSet.h +++ b/LeaseSet.h @@ -21,7 +21,19 @@ namespace data { IdentHash tunnelGateway; uint32_t tunnelID; - uint64_t endDate; + uint64_t endDate; // 0 means invalid + bool isUpdated; // trasient + }; + + struct LeaseCmp + { + bool operator() (std::shared_ptr l1, std::shared_ptr l2) const + { + if (l1->tunnelID != l2->tunnelID) + return l1->tunnelID < l2->tunnelID; + else + return l1->tunnelGateway < l2->tunnelGateway; + }; }; const int MAX_LS_BUFFER_SIZE = 3072; @@ -34,14 +46,12 @@ namespace data LeaseSet (std::shared_ptr pool); ~LeaseSet () { delete[] m_Buffer; }; void Update (const uint8_t * buf, size_t len); - void PopulateLeases (); /// from buffer + void PopulateLeases (); // from buffer std::shared_ptr GetIdentity () const { return m_Identity; }; const uint8_t * GetBuffer () const { return m_Buffer; }; size_t GetBufferLen () const { return m_BufferLen; }; bool IsValid () const { return m_IsValid; }; - - const std::vector >& GetLeases () const { return m_Leases; }; const std::vector > GetNonExpiredLeases (bool withThreshold = true) const; bool HasExpiredLeases () const; bool IsExpired () const; @@ -59,7 +69,7 @@ namespace data private: bool m_IsValid, m_StoreLeases; // we don't need to store leases for floodfill - std::vector > m_Leases; + std::set, LeaseCmp> m_Leases; uint64_t m_ExpirationTime; // in milliseconds std::shared_ptr m_Identity; uint8_t m_EncryptionKey[256];