diff --git a/SSUData.cpp b/SSUData.cpp index 69b4287f..f60d7f13 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -115,10 +115,7 @@ namespace transport if (bitfield & mask) { if (fragment < numSentFragments) - { - delete it->second->fragments[fragment]; - it->second->fragments[fragment] = nullptr; - } + it->second->fragments[fragment].reset (nullptr); } fragment++; mask <<= 1; @@ -312,7 +309,6 @@ namespace transport Fragment * fragment = new Fragment; fragment->fragmentNum = fragmentNum; uint8_t * buf = fragment->buf; - fragments.push_back (fragment); uint8_t * payload = buf + sizeof (SSUHeader); *payload = DATA_FLAG_WANT_REPLY; // for compatibility payload++; @@ -336,6 +332,7 @@ namespace transport if (size & 0x0F) // make sure 16 bytes boundary size = ((size >> 4) + 1) << 4; // (/16 + 1)*16 fragment->len = size; + fragments.push_back (std::unique_ptr (fragment)); // encrypt message with session key m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, size); @@ -417,7 +414,7 @@ namespace transport { if (ts >= it.second->nextResendTime && it.second->numResends < MAX_NUM_RESENDS) { - for (auto f: it.second->fragments) + for (auto& f: it.second->fragments) if (f) m_Session.Send (f->buf, f->len); // resend it.second->numResends++; diff --git a/SSUData.h b/SSUData.h index 57e14832..421a646d 100644 --- a/SSUData.h +++ b/SSUData.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "I2NPProtocol.h" #include "Identity.h" @@ -65,11 +66,9 @@ namespace transport struct SentMessage { - std::vector fragments; + std::vector > fragments; uint32_t nextResendTime; // in seconds int numResends; - - ~SentMessage () { for (auto it: fragments) { delete it; }; }; }; class SSUSession;