diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 0d66f08f..3dda72e2 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -143,7 +143,7 @@ namespace transport m_Server (server), m_Socket (m_Server.GetService ()), m_IsEstablished (false), m_IsTerminated (false), m_SessionRequestBuffer (nullptr), m_SessionCreatedBuffer (nullptr), m_SessionConfirmedBuffer (nullptr), - m_NextReceivedBuffer (nullptr), m_NextSendBuffer (nullptr), + m_NextReceivedLen (0), m_NextReceivedBuffer (nullptr), m_NextSendBuffer (nullptr), m_ReceiveSequenceNumber (0), m_SendSequenceNumber (0), m_IsSending (false) { m_Establisher.reset (new NTCP2Establisher); @@ -647,11 +647,15 @@ namespace transport } else { - i2p::crypto::Siphash<8> (m_ReceiveIV, m_ReceiveIV, 8, m_ReceiveSipKey); + i2p::crypto::Siphash<8> (m_ReceiveIV, m_ReceiveIV, 8, m_ReceiveSipKey); + uint16_t oldLen = m_NextReceivedLen; m_NextReceivedLen = be16toh (m_NextReceivedLen ^ bufbe16toh(m_ReceiveIV)); LogPrint (eLogDebug, "NTCP2: received length ", m_NextReceivedLen); - delete[] m_NextReceivedBuffer; - m_NextReceivedBuffer = new uint8_t[m_NextReceivedLen]; + if (m_NextReceivedLen > oldLen) + { + delete[] m_NextReceivedBuffer; + m_NextReceivedBuffer = new uint8_t[m_NextReceivedLen]; + } Receive (); } } @@ -784,7 +788,8 @@ namespace transport { if (!m_SendQueue.empty ()) { - uint8_t * payload = new uint8_t[NTCP2_UNENCRYPTED_FRAME_MAX_SIZE]; + auto buf = m_Server.NewNTCP2FrameBuffer (); + uint8_t * payload = buf->data (); size_t s = 0; // add I2NP blocks while (!m_SendQueue.empty ()) @@ -815,7 +820,7 @@ namespace transport s += paddingSize; // send SendNextFrame (payload, s); - delete[] payload; + m_Server.DeleteNTCP2FrameBuffer (buf); } } diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index e4b2cddd..f63479ed 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -6,8 +6,10 @@ #include #include #include +#include #include #include +#include "util.h" #include "RouterInfo.h" #include "TransportSession.h" @@ -57,6 +59,7 @@ namespace transport }; + typedef std::array NTCP2FrameBuffer; struct NTCP2Establisher { NTCP2Establisher (); @@ -187,6 +190,9 @@ namespace transport void Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr conn); + NTCP2FrameBuffer * NewNTCP2FrameBuffer () { return m_NTCP2FrameBuffersPool.Acquire(); } + void DeleteNTCP2FrameBuffer (NTCP2FrameBuffer * buf) { return m_NTCP2FrameBuffersPool.Release(buf); } + private: void Run (); @@ -210,6 +216,8 @@ namespace transport std::map > m_NTCP2Sessions; std::list > m_PendingIncomingSessions; + i2p::util::MemoryPool m_NTCP2FrameBuffersPool; + public: // for HTTP/I2PControl