From b46b15cce4282321697a0c7a1eb7120a387c76b4 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 18 Sep 2014 11:11:51 -0400 Subject: [PATCH] avoid double delete --- NTCPSession.cpp | 18 ++++++++++++------ NTCPSession.h | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index a083359d..922df500 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -255,6 +255,8 @@ namespace ntcp if (memcmp (hxy, m_Establisher->phase2.encrypted.hxy, 32)) { LogPrint ("Incorrect hash"); + i2p::transports.ReuseDHKeysPair (m_DHKeysPair); + m_DHKeysPair = nullptr; Terminate (); return ; } @@ -427,7 +429,11 @@ namespace ntcp uint8_t * nextBlock = m_ReceiveBuffer; while (m_ReceiveBufferOffset >= 16) { - DecryptNextBlock (nextBlock); // 16 bytes + if (!DecryptNextBlock (nextBlock)) // 16 bytes + { + Terminate (); + return; + } nextBlock += 16; m_ReceiveBufferOffset -= 16; } @@ -440,7 +446,7 @@ namespace ntcp } } - void NTCPSession::DecryptNextBlock (const uint8_t * encrypted) // 16 bytes + bool NTCPSession::DecryptNextBlock (const uint8_t * encrypted) // 16 bytes { if (!m_NextMessage) // new message, header expected { @@ -457,8 +463,7 @@ namespace ntcp LogPrint ("NTCP data size ", dataSize, " exceeds max size"); i2p::DeleteI2NPMessage (m_NextMessage); m_NextMessage = nullptr; - Terminate (); - return; + return false; } m_NextMessageOffset += 16; m_NextMessage->offset = 2; // size field @@ -470,7 +475,7 @@ namespace ntcp LogPrint ("Timestamp"); i2p::DeleteI2NPMessage (m_NextMessage); m_NextMessage = nullptr; - return; + return true; } } else // message continues @@ -484,7 +489,8 @@ namespace ntcp // we have a complete I2NP message i2p::HandleI2NPMessage (m_NextMessage); m_NextMessage = nullptr; - } + } + return true; } void NTCPSession::Send (i2p::I2NPMessage * msg) diff --git a/NTCPSession.h b/NTCPSession.h index 2ebe6b5f..363a81cf 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -112,7 +112,7 @@ namespace ntcp // common void Receive (); void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred); - void DecryptNextBlock (const uint8_t * encrypted); + bool DecryptNextBlock (const uint8_t * encrypted); void Send (i2p::I2NPMessage * msg); void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, i2p::I2NPMessage * msg); @@ -143,7 +143,7 @@ namespace ntcp NTCPPhase4 phase4; } * m_Establisher; - uint8_t m_ReceiveBuffer[NTCP_BUFFER_SIZE], m_TimeSyncBuffer[16]; + uint8_t m_ReceiveBuffer[NTCP_BUFFER_SIZE + 16], m_TimeSyncBuffer[16]; int m_ReceiveBufferOffset; i2p::I2NPMessage * m_NextMessage;