diff --git a/SSUData.cpp b/SSUData.cpp index 32e66e22..78f93270 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -48,6 +48,9 @@ namespace transport { m_ResendTimer.cancel (); m_IncompleteMessagesCleanupTimer.cancel (); + m_IncompleteMessages.clear (); + m_SentMessages.clear (); + m_ReceivedMessages.clear (); } void SSUData::AdjustPacketSize (std::shared_ptr remoteRouter) diff --git a/SSUSession.cpp b/SSUSession.cpp index d54a1137..49757772 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -104,6 +104,7 @@ namespace transport DecryptSessionKey (buf, len); else { + if (m_State == eSessionStateEstablished) Reset (); // new session key required // try intro key depending on side if (Validate (buf, len, m_IntroKey)) Decrypt (buf, len, m_IntroKey); @@ -869,14 +870,26 @@ namespace transport void SSUSession::Close () { + SendSessionDestroyed (); + Reset (); m_State = eSessionStateClosed; - SendSesionDestroyed (); + } + + void SSUSession::Reset () + { + m_State = eSessionStateUnknown; transports.PeerDisconnected (shared_from_this ()); m_Data.Stop (); m_ConnectTimer.cancel (); if (m_SentRelayTag) + { m_Server.RemoveRelay (m_SentRelayTag); // relay tag is not valid anymore - } + m_SentRelayTag = 0; + } + m_DHKeysPair = nullptr; + m_SignedData = nullptr; + m_IsSessionKey = false; + } void SSUSession::Done () { @@ -1140,7 +1153,7 @@ namespace transport } } - void SSUSession::SendSesionDestroyed () + void SSUSession::SendSessionDestroyed () { if (m_IsSessionKey) { diff --git a/SSUSession.h b/SSUSession.h index b25beeae..af13c645 100644 --- a/SSUSession.h +++ b/SSUSession.h @@ -121,7 +121,7 @@ namespace transport void ProcessPeerTest (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint); void SendPeerTest (uint32_t nonce, const boost::asio::ip::address& address, uint16_t port, const uint8_t * introKey, bool toAddress = true, bool sendAddress = true); void ProcessData (uint8_t * buf, size_t len); - void SendSesionDestroyed (); + void SendSessionDestroyed (); void Send (uint8_t type, const uint8_t * payload, size_t len); // with session key void Send (const uint8_t * buf, size_t size); @@ -132,6 +132,8 @@ namespace transport void DecryptSessionKey (uint8_t * buf, size_t len); bool Validate (uint8_t * buf, size_t len, const i2p::crypto::MACKey& macKey); + void Reset (); + private: friend class SSUData; // TODO: change in later