diff --git a/SSUSession.cpp b/SSUSession.cpp index c5e04d23..7aedef07 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -759,6 +759,11 @@ namespace transport transports.PeerDisconnected (shared_from_this ()); } + void SSUSession::Terminate () + { + m_Server.DeleteSession (shared_from_this ()); + } + void SSUSession::Established () { m_State = eSessionStateEstablished; diff --git a/SSUSession.h b/SSUSession.h index 565afc1f..35cffbe5 100644 --- a/SSUSession.h +++ b/SSUSession.h @@ -63,6 +63,7 @@ namespace transport void Introduce (uint32_t iTag, const uint8_t * iKey); void WaitForIntroduction (); void Close (); + void Terminate (); boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; }; bool IsV6 () const { return m_RemoteEndpoint.address ().is_v6 (); }; void SendI2NPMessage (I2NPMessage * msg); diff --git a/TransportSession.h b/TransportSession.h index 45ce9366..1acc9493 100644 --- a/TransportSession.h +++ b/TransportSession.h @@ -62,6 +62,7 @@ namespace transport } virtual ~TransportSession () { delete m_DHKeysPair; }; + virtual void Terminate () = 0; std::shared_ptr GetRemoteRouter () { return m_RemoteRouter; }; const i2p::data::IdentityEx& GetRemoteIdentity () { return m_RemoteIdentity; }; diff --git a/Transports.cpp b/Transports.cpp index ddfde44b..b163922c 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -405,9 +405,17 @@ namespace transport auto it = m_Peers.find (ident); if (it != m_Peers.end ()) { - it->second.session = session; - session->SendI2NPMessages (it->second.delayedMessages); - it->second.delayedMessages.clear (); + if (!it->second.session) + { + it->second.session = session; + session->SendI2NPMessages (it->second.delayedMessages); + it->second.delayedMessages.clear (); + } + else + { + LogPrint (eLogError, "Session for ", ident.ToBase64 ().substr (0, 4), " already exists"); + session->Terminate (); + } } else // incoming connection m_Peers[ident] = { 0, nullptr, session }; @@ -420,7 +428,7 @@ namespace transport { auto ident = session->GetRemoteIdentity ().GetIdentHash (); auto it = m_Peers.find (ident); - if (it != m_Peers.end ()) + if (it != m_Peers.end () && it->second.session == session) { if (it->second.delayedMessages.size () > 0) ConnectToPeer (ident, it->second);