From 10bd017e5731f44c97d46c5ffd0c5933a8d7af12 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 21 Nov 2016 19:45:29 -0500 Subject: [PATCH] 16-byte alignment for received I2NP message --- NTCPSession.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index f9116e3d..b65532be 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -574,17 +574,17 @@ namespace transport if (dataSize) { // new message - if (dataSize + 16U > NTCP_MAX_MESSAGE_SIZE - 2) // + 6 + padding + if (dataSize + 16U + 15U > NTCP_MAX_MESSAGE_SIZE - 2) // + 6 + padding { LogPrint (eLogError, "NTCP: data size ", dataSize, " exceeds max size"); return false; } - auto msg = (dataSize + 16U) <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage (); - m_NextMessage = msg; - memcpy (m_NextMessage->buf, buf, 16); + m_NextMessage = (dataSize + 16U + 15U) <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage (); + m_NextMessage->Align (16); + m_NextMessage->offset += 2; // size field + m_NextMessage->len = m_NextMessage->offset + dataSize; + memcpy (m_NextMessage->GetBuffer () - 2, buf, 16); m_NextMessageOffset = 16; - m_NextMessage->offset = 2; // size field - m_NextMessage->len = dataSize + 2; } else { @@ -595,16 +595,16 @@ namespace transport } else // message continues { - m_Decryption.Decrypt (encrypted, m_NextMessage->buf + m_NextMessageOffset); + m_Decryption.Decrypt (encrypted, m_NextMessage->GetBuffer () - 2 + m_NextMessageOffset); m_NextMessageOffset += 16; } - if (m_NextMessageOffset >= m_NextMessage->len + 4) // +checksum + if (m_NextMessageOffset >= m_NextMessage->GetLength () + 2 + 4) // +checksum { // we have a complete I2NP message uint8_t checksum[4]; - htobe32buf (checksum, adler32 (adler32 (0, Z_NULL, 0), m_NextMessage->buf, m_NextMessageOffset - 4)); - if (!memcmp (m_NextMessage->buf + m_NextMessageOffset - 4, checksum, 4)) + htobe32buf (checksum, adler32 (adler32 (0, Z_NULL, 0), m_NextMessage->GetBuffer () - 2, m_NextMessageOffset - 4)); + if (!memcmp (m_NextMessage->GetBuffer () - 2 + m_NextMessageOffset - 4, checksum, 4)) { if (!m_NextMessage->IsExpired ()) {