diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index e4685c7e..c0806d53 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -582,20 +582,20 @@ namespace i2p Flush (); } - void I2NPMessagesHandler::PutNextMessage (I2NPMessage * msg) + void I2NPMessagesHandler::PutNextMessage (std::shared_ptr msg) { if (msg) { switch (msg->GetTypeID ()) { case eI2NPTunnelData: - m_TunnelMsgs.push_back (ToSharedI2NPMessage (msg)); + m_TunnelMsgs.push_back (msg); break; case eI2NPTunnelGateway: - m_TunnelGatewayMsgs.push_back (ToSharedI2NPMessage (msg)); + m_TunnelGatewayMsgs.push_back (msg); break; default: - HandleI2NPMessage (ToSharedI2NPMessage (msg)); + HandleI2NPMessage (msg); } } } diff --git a/I2NPProtocol.h b/I2NPProtocol.h index cee97bec..4e8a8f8d 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -236,7 +236,7 @@ namespace tunnel public: ~I2NPMessagesHandler (); - void PutNextMessage (I2NPMessage * msg); + void PutNextMessage (std::shared_ptr msg); void Flush (); private: diff --git a/NTCPSession.cpp b/NTCPSession.cpp index b7596997..4b622c73 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -84,11 +84,7 @@ namespace transport transports.PeerDisconnected (shared_from_this ()); m_Server.RemoveNTCPSession (shared_from_this ()); m_SendQueue.clear (); - if (m_NextMessage) - { - i2p::DeleteI2NPMessage (m_NextMessage); - m_NextMessage = nullptr; - } + m_NextMessage = nullptr; m_TerminationTimer.cancel (); LogPrint (eLogInfo, "NTCP session terminated"); } @@ -564,7 +560,8 @@ namespace transport LogPrint (eLogError, "NTCP data size ", dataSize, " exceeds max size"); return false; } - m_NextMessage = dataSize <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage (); + auto msg = dataSize <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage (); + m_NextMessage = ToSharedI2NPMessage (msg); memcpy (m_NextMessage->buf, buf, 16); m_NextMessageOffset = 16; m_NextMessage->offset = 2; // size field @@ -589,10 +586,7 @@ namespace transport if (CryptoPP::Adler32().VerifyDigest (m_NextMessage->buf + m_NextMessageOffset - 4, m_NextMessage->buf, m_NextMessageOffset - 4)) m_Handler.PutNextMessage (m_NextMessage); else - { LogPrint (eLogWarning, "Incorrect adler checksum of NTCP message. Dropped"); - DeleteI2NPMessage (m_NextMessage); - } m_NextMessage = nullptr; } return true; diff --git a/NTCPSession.h b/NTCPSession.h index b09713e4..96644eea 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -126,7 +126,7 @@ namespace transport i2p::crypto::AESAlignedBuffer<16> m_TimeSyncBuffer; int m_ReceiveBufferOffset; - i2p::I2NPMessage * m_NextMessage; + std::shared_ptr m_NextMessage; size_t m_NextMessageOffset; i2p::I2NPMessagesHandler m_Handler; diff --git a/SSUData.cpp b/SSUData.cpp index 83b82aab..5c0c03dd 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -15,9 +15,8 @@ namespace transport if (msg->len + fragmentSize > msg->maxLen) { LogPrint (eLogInfo, "SSU I2NP message size ", msg->maxLen, " is not enough"); - I2NPMessage * newMsg = NewI2NPMessage (); + auto newMsg = ToSharedI2NPMessage(NewI2NPMessage ()); *newMsg = *msg; - DeleteI2NPMessage (msg); msg = newMsg; } memcpy (msg->buf + msg->len, fragment, fragmentSize); @@ -174,7 +173,7 @@ namespace transport if (it == m_IncompleteMessages.end ()) { // create new message - auto msg = NewI2NPShortMessage (); + auto msg = ToSharedI2NPMessage (NewI2NPShortMessage ()); msg->len -= I2NP_SHORT_HEADER_SIZE; it = m_IncompleteMessages.insert (std::make_pair (msgID, std::unique_ptr(new IncompleteMessage (msg)))).first; @@ -244,10 +243,7 @@ namespace transport m_Handler.PutNextMessage (msg); } else - { LogPrint (eLogWarning, "SSU message ", msgID, " already received"); - i2p::DeleteI2NPMessage (msg); - } } else { @@ -259,7 +255,6 @@ namespace transport } else LogPrint (eLogError, "SSU unexpected message ", (int)msg->GetTypeID ()); - DeleteI2NPMessage (msg); } } else diff --git a/SSUData.h b/SSUData.h index 39d14cc4..60d5057e 100644 --- a/SSUData.h +++ b/SSUData.h @@ -59,13 +59,12 @@ namespace transport struct IncompleteMessage { - I2NPMessage * msg; + std::shared_ptr msg; int nextFragmentNum; uint32_t lastFragmentInsertTime; // in seconds std::set, FragmentCmp> savedFragments; - IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (0), lastFragmentInsertTime (0) {}; - ~IncompleteMessage () { if (msg) DeleteI2NPMessage (msg); }; + IncompleteMessage (std::shared_ptr m): msg (m), nextFragmentNum (0), lastFragmentInsertTime (0) {}; void AttachNextFragment (const uint8_t * fragment, size_t fragmentSize); };