diff --git a/SSUData.cpp b/SSUData.cpp index 62ffba61..377c8fbb 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -221,7 +221,19 @@ namespace ssu SendMsgAck (msgID); msg->FromSSU (msgID); if (m_Session.GetState () == eSessionStateEstablished) - i2p::HandleI2NPMessage (msg); + { + if (!m_ReceivedMessages.count (msgID)) + { + if (m_ReceivedMessages.size () > 100) m_ReceivedMessages.clear (); + m_ReceivedMessages.insert (msgID); + i2p::HandleI2NPMessage (msg); + } + else + { + LogPrint ("SSU message ", msgID, " already received"); + i2p::DeleteI2NPMessage (msg); + } + } else { // we expect DeliveryStatus diff --git a/SSUData.h b/SSUData.h index afa36f8d..9ac431a2 100644 --- a/SSUData.h +++ b/SSUData.h @@ -100,6 +100,7 @@ namespace ssu SSUSession& m_Session; std::map m_IncomleteMessages; std::map m_SentMessages; + std::set m_ReceivedMessages; boost::asio::deadline_timer m_ResendTimer; int m_PacketSize; };