From 541a49c35951f3ec7bab2f6df5c7a9c098ec019b Mon Sep 17 00:00:00 2001 From: orignal Date: Sat, 19 Jul 2014 18:53:02 -0400 Subject: [PATCH] fixed memory leak --- SSUData.cpp | 15 ++++++++------- SSUData.h | 9 ++++++++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/SSUData.cpp b/SSUData.cpp index bf9135cc..ab0ed45d 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -22,7 +22,7 @@ namespace ssu } for (auto it: m_SentMessages) { - for (auto f: it.second) + for (auto f: it.second.fragments) delete[] f; } } @@ -33,7 +33,7 @@ namespace ssu if (it != m_SentMessages.end ()) { // delete all ack-ed message's fragments - for (auto f: it->second) + for (auto f: it->second.fragments) delete[] f; m_SentMessages.erase (it); } @@ -59,8 +59,7 @@ namespace ssu { uint32_t msgID = be32toh (*(uint32_t *)buf); buf += 4; // msgID - auto it = m_SentMessages.find (msgID); - int numSentFragments = it->second.size (); + auto it = m_SentMessages.find (msgID); // process individual Ack bitfields bool isNonLast = false; int fragment = 0; @@ -71,6 +70,7 @@ namespace ssu bitfield &= 0x7F; // clear MSB if (bitfield && it != m_SentMessages.end ()) { + int numSentFragments = it->second.fragments.size (); // process bits uint8_t mask = 0x40; for (int j = 0; j < 7; j++) @@ -79,8 +79,8 @@ namespace ssu { if (fragment < numSentFragments) { - delete[] it->second[fragment]; - it->second[fragment] = nullptr; + delete[] it->second.fragments[fragment]; + it->second.fragments[fragment] = nullptr; } } fragment++; @@ -238,7 +238,8 @@ namespace ssu DeleteI2NPMessage (msg); return; } - auto fragments = m_SentMessages[msgID]; + SentMessage& sentMessage = m_SentMessages[msgID]; + auto& fragments = sentMessage.fragments; msgID = htobe32 (msgID); size_t payloadSize = SSU_MTU - sizeof (SSUHeader) - 9; // 9 = flag + #frg(1) + messageID(4) + frag info (3) size_t len = msg->GetLength (); diff --git a/SSUData.h b/SSUData.h index 9cc548e0..1cf18eff 100644 --- a/SSUData.h +++ b/SSUData.h @@ -49,6 +49,13 @@ namespace ssu IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (0) {}; ~IncompleteMessage () { for (auto it: savedFragments) { delete it; }; }; }; + + struct SentMessage + { + std::vector fragments; + uint32_t nextResendTime; // in seconds + int numResends; + }; class SSUSession; class SSUData @@ -75,7 +82,7 @@ namespace ssu SSUSession& m_Session; std::map m_IncomleteMessages; - std::map > m_SentMessages; // msgID -> fragments + std::map m_SentMessages; // msgID -> fragments }; } }