From 8a2c4ab3debba75129d35087e4f3776334a6e03e Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 1 Feb 2017 15:20:03 -0500 Subject: [PATCH] don't create identity if presented in netdb already --- NTCPSession.cpp | 7 +++++-- SSUSession.cpp | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 883f0a11..48b4aecb 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -346,12 +346,15 @@ namespace transport m_Decryption.Decrypt (m_ReceiveBuffer, bytes_transferred, m_ReceiveBuffer); uint8_t * buf = m_ReceiveBuffer; uint16_t size = bufbe16toh (buf); - SetRemoteIdentity (std::make_shared (buf + 2, size)); - if (m_Server.FindNTCPSession (m_RemoteIdentity->GetIdentHash ())) + auto identity = std::make_shared (buf + 2, size); + if (m_Server.FindNTCPSession (identity->GetIdentHash ())) { LogPrint (eLogInfo, "NTCP: session already exists"); Terminate (); } + auto existing = i2p::data::netdb.FindRouter (identity->GetIdentHash ()); // check if exists already + SetRemoteIdentity (existing ? existing->GetRouterIdentity () : identity); + size_t expectedSize = size + 2/*size*/ + 4/*timestamp*/ + m_RemoteIdentity->GetSignatureLen (); size_t paddingLen = expectedSize & 0x0F; if (paddingLen) paddingLen = (16 - paddingLen); diff --git a/SSUSession.cpp b/SSUSession.cpp index 844ed2e4..d54a1137 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -4,6 +4,7 @@ #include "Timestamp.h" #include "RouterContext.h" #include "Transports.h" +#include "NetDb.h" #include "SSU.h" #include "SSUSession.h" @@ -317,7 +318,9 @@ namespace transport payload++; // identity fragment info uint16_t identitySize = bufbe16toh (payload); payload += 2; // size of identity fragment - SetRemoteIdentity (std::make_shared (payload, identitySize)); + auto identity = std::make_shared (payload, identitySize); + auto existing = i2p::data::netdb.FindRouter (identity->GetIdentHash ()); // check if exists already + SetRemoteIdentity (existing ? existing->GetRouterIdentity () : identity); m_Data.UpdatePacketSize (m_RemoteIdentity->GetIdentHash ()); payload += identitySize; // identity auto ts = i2p::util::GetSecondsSinceEpoch ();