diff --git a/Destination.cpp b/Destination.cpp index c07718cb..e7e9b93c 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -303,7 +303,7 @@ namespace client } else { - LogPrint (eLogError, "New remote LeaseSet verification failed"); + LogPrint (eLogError, "New remote LeaseSet failed"); leaseSet = nullptr; } } @@ -678,7 +678,7 @@ namespace client auto ts = i2p::util::GetMillisecondsSinceEpoch (); for (auto it = m_RemoteLeaseSets.begin (); it != m_RemoteLeaseSets.end ();) { - if (ts > it->second->GetExpirationTime ()) // leaseset expired + if (it->second->IsEmpty () || ts > it->second->GetExpirationTime ()) // leaseset expired { LogPrint (eLogWarning, "Destination: Remote LeaseSet ", it->second->GetIdentHash ().ToBase64 (), " expired"); it = m_RemoteLeaseSets.erase (it); diff --git a/LeaseSet.cpp b/LeaseSet.cpp index 921941b1..ebbdbd97 100644 --- a/LeaseSet.cpp +++ b/LeaseSet.cpp @@ -119,6 +119,7 @@ namespace data // process leases m_ExpirationTime = 0; + auto ts = i2p::util::GetMillisecondsSinceEpoch (); const uint8_t * leases = m_Buffer + size; for (int i = 0; i < num; i++) { @@ -129,21 +130,32 @@ namespace data leases += 4; // tunnel ID lease.endDate = bufbe64toh (leases); leases += 8; // end date - if (lease.endDate > m_ExpirationTime) - m_ExpirationTime = lease.endDate; - if (m_StoreLeases) + if (ts < lease.endDate) { - 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)) - { - // if not found request it - LogPrint (eLogInfo, "LeaseSet: Lease's tunnel gateway not found, requesting"); - netdb.RequestDestination (lease.tunnelGateway); - } - } + if (lease.endDate > m_ExpirationTime) + m_ExpirationTime = lease.endDate; + if (m_StoreLeases) + { + 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)) + { + // if not found request it + LogPrint (eLogInfo, "LeaseSet: Lease's tunnel gateway not found, requesting"); + netdb.RequestDestination (lease.tunnelGateway); + } + } + } + else + LogPrint (eLogWarning, "LeaseSet: Lease is expired already "); + } + if (!m_ExpirationTime) + { + LogPrint (eLogWarning, "LeaseSet: all leases are expired. Dropped"); + m_IsValid = false; + return; } // delete old leases if (m_StoreLeases) @@ -193,6 +205,7 @@ namespace data bool LeaseSet::IsExpired () const { + if (IsEmpty ()) return true; auto ts = i2p::util::GetMillisecondsSinceEpoch (); return ts > m_ExpirationTime; } diff --git a/LeaseSet.h b/LeaseSet.h index b9607494..dd94bfaf 100644 --- a/LeaseSet.h +++ b/LeaseSet.h @@ -55,6 +55,7 @@ namespace data const std::vector > GetNonExpiredLeases (bool withThreshold = true) const; bool HasExpiredLeases () const; bool IsExpired () const; + bool IsEmpty () const { return m_Leases.empty (); }; uint64_t GetExpirationTime () const { return m_ExpirationTime; }; // implements RoutingDestination diff --git a/Streaming.cpp b/Streaming.cpp index 5de9edfb..9c05c9cb 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -704,11 +704,11 @@ namespace stream void Stream::UpdateCurrentRemoteLease (bool expired) { - if (!m_RemoteLeaseSet) + if (!m_RemoteLeaseSet || m_RemoteLeaseSet->IsExpired ()) { m_RemoteLeaseSet = m_LocalDestination.GetOwner ()->FindLeaseSet (m_RemoteIdentity->GetIdentHash ()); - if (!m_RemoteLeaseSet) - LogPrint (eLogError, "Streaming: LeaseSet ", m_RemoteIdentity->GetIdentHash ().ToBase64 (), " not found"); + if (!m_RemoteLeaseSet) + LogPrint (eLogWarning, "Streaming: LeaseSet ", m_RemoteIdentity->GetIdentHash ().ToBase64 (), " not found"); } if (m_RemoteLeaseSet) {