diff --git a/SSUData.cpp b/SSUData.cpp index 9902448e..5bdb9702 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -23,11 +23,7 @@ namespace transport SSUData::~SSUData () { for (auto it: m_IncomleteMessages) - if (it.second) - { - DeleteI2NPMessage (it.second->msg); - delete it.second; - } + delete it.second; for (auto it: m_SentMessages) delete it.second; } @@ -182,7 +178,7 @@ namespace transport // try saved fragments for (auto it1 = incompleteMessage->savedFragments.begin (); it1 != incompleteMessage->savedFragments.end ();) { - auto savedFragment = *it1; + auto& savedFragment = *it1; if (savedFragment->fragmentNum == incompleteMessage->nextFragmentNum) { memcpy (msg->buf + msg->len, savedFragment->buf, savedFragment->len); @@ -190,7 +186,6 @@ namespace transport isLast = savedFragment->isLast; incompleteMessage->nextFragmentNum++; incompleteMessage->savedFragments.erase (it1++); - delete savedFragment; } else break; @@ -209,11 +204,8 @@ namespace transport // missing fragment LogPrint (eLogWarning, "Missing fragments from ", (int)incompleteMessage->nextFragmentNum, " to ", fragmentNum - 1, " of message ", msgID); auto savedFragment = new Fragment (fragmentNum, buf, fragmentSize, isLast); - if (!incompleteMessage->savedFragments.insert (savedFragment).second) - { + if (!incompleteMessage->savedFragments.insert (std::unique_ptr(savedFragment)).second) LogPrint (eLogWarning, "Fragment ", (int)fragmentNum, " of message ", msgID, " already saved"); - delete savedFragment; - } } isLast = false; } @@ -221,6 +213,7 @@ namespace transport if (isLast) { // delete incomplete message + incompleteMessage->msg = nullptr; delete incompleteMessage; m_IncomleteMessages.erase (msgID); // process message diff --git a/SSUData.h b/SSUData.h index 421a646d..ec94abd0 100644 --- a/SSUData.h +++ b/SSUData.h @@ -48,7 +48,7 @@ namespace transport struct FragmentCmp { - bool operator() (const Fragment * f1, const Fragment * f2) const + bool operator() (const std::unique_ptr& f1, const std::unique_ptr& f2) const { return f1->fragmentNum < f2->fragmentNum; }; @@ -58,10 +58,10 @@ namespace transport { I2NPMessage * msg; int nextFragmentNum; - std::set savedFragments; + std::set, FragmentCmp> savedFragments; IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (0) {}; - ~IncompleteMessage () { for (auto it: savedFragments) { delete it; }; }; + ~IncompleteMessage () { if (msg) DeleteI2NPMessage (msg); }; }; struct SentMessage