mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
check I2NP message buffer size
This commit is contained in:
parent
a26c5f85c3
commit
ff48422ec0
@ -51,21 +51,16 @@ namespace i2p
|
|||||||
SetExpiration (i2p::util::GetMillisecondsSinceEpoch () + 5000);
|
SetExpiration (i2p::util::GetMillisecondsSinceEpoch () + 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID)
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, size_t len, uint32_t replyMsgID)
|
||||||
{
|
{
|
||||||
auto msg = NewI2NPMessage (len);
|
auto msg = NewI2NPMessage (len);
|
||||||
if (msg->len + len < msg->maxLen)
|
if (msg->Concat (buf, len) < len)
|
||||||
{
|
LogPrint (eLogError, "I2NP: message length ", len, " exceeds max length ", msg->maxLen);
|
||||||
memcpy (msg->GetPayload (), buf, len);
|
|
||||||
msg->len += len;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LogPrint (eLogError, "I2NP: message length ", len, " exceeds max length");
|
|
||||||
msg->FillI2NPMessageHeader (msgType, replyMsgID);
|
msg->FillI2NPMessageHeader (msgType, replyMsgID);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from)
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr<i2p::tunnel::InboundTunnel> from)
|
||||||
{
|
{
|
||||||
auto msg = NewI2NPMessage ();
|
auto msg = NewI2NPMessage ();
|
||||||
if (msg->offset + len < msg->maxLen)
|
if (msg->offset + len < msg->maxLen)
|
||||||
@ -413,8 +408,7 @@ namespace i2p
|
|||||||
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (const uint8_t * buf)
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (const uint8_t * buf)
|
||||||
{
|
{
|
||||||
auto msg = NewI2NPShortMessage ();
|
auto msg = NewI2NPShortMessage ();
|
||||||
memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
|
msg->Concat (buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
|
||||||
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
|
||||||
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -422,9 +416,9 @@ namespace i2p
|
|||||||
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
||||||
{
|
{
|
||||||
auto msg = NewI2NPShortMessage ();
|
auto msg = NewI2NPShortMessage ();
|
||||||
memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
|
|
||||||
htobe32buf (msg->GetPayload (), tunnelID);
|
htobe32buf (msg->GetPayload (), tunnelID);
|
||||||
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
msg->len += 4; // tunnelID
|
||||||
|
msg->Concat (payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
|
||||||
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -442,8 +436,9 @@ namespace i2p
|
|||||||
uint8_t * payload = msg->GetPayload ();
|
uint8_t * payload = msg->GetPayload ();
|
||||||
htobe32buf (payload + TUNNEL_GATEWAY_HEADER_TUNNELID_OFFSET, tunnelID);
|
htobe32buf (payload + TUNNEL_GATEWAY_HEADER_TUNNELID_OFFSET, tunnelID);
|
||||||
htobe16buf (payload + TUNNEL_GATEWAY_HEADER_LENGTH_OFFSET, len);
|
htobe16buf (payload + TUNNEL_GATEWAY_HEADER_LENGTH_OFFSET, len);
|
||||||
memcpy (payload + TUNNEL_GATEWAY_HEADER_SIZE, buf, len);
|
msg->len += TUNNEL_GATEWAY_HEADER_SIZE;
|
||||||
msg->len += TUNNEL_GATEWAY_HEADER_SIZE + len;
|
if (msg->Concat (buf, len) < len)
|
||||||
|
LogPrint (eLogError, "I2NP: tunnel gateway buffer overflow ", msg->maxLen);
|
||||||
msg->FillI2NPMessageHeader (eI2NPTunnelGateway);
|
msg->FillI2NPMessageHeader (eI2NPTunnelGateway);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -473,8 +468,8 @@ namespace i2p
|
|||||||
size_t gatewayMsgOffset = I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE;
|
size_t gatewayMsgOffset = I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE;
|
||||||
msg->offset += gatewayMsgOffset;
|
msg->offset += gatewayMsgOffset;
|
||||||
msg->len += gatewayMsgOffset;
|
msg->len += gatewayMsgOffset;
|
||||||
memcpy (msg->GetPayload (), buf, len);
|
if (msg->Concat (buf, len) < len)
|
||||||
msg->len += len;
|
LogPrint (eLogError, "I2NP: tunnel gateway buffer overflow ", msg->maxLen);
|
||||||
msg->FillI2NPMessageHeader (msgType, replyMsgID); // create content message
|
msg->FillI2NPMessageHeader (msgType, replyMsgID); // create content message
|
||||||
len = msg->GetLength ();
|
len = msg->GetLength ();
|
||||||
msg->offset -= gatewayMsgOffset;
|
msg->offset -= gatewayMsgOffset;
|
||||||
|
@ -155,6 +155,15 @@ namespace tunnel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t Concat (const uint8_t * buf1, size_t len1)
|
||||||
|
{
|
||||||
|
// make sure with don't write beyond maxLen
|
||||||
|
if (len + len1 > maxLen) len1 = maxLen - len;
|
||||||
|
memcpy (buf + len, buf1, len1);
|
||||||
|
len += len1;
|
||||||
|
return len1;
|
||||||
|
}
|
||||||
|
|
||||||
I2NPMessage& operator=(const I2NPMessage& other)
|
I2NPMessage& operator=(const I2NPMessage& other)
|
||||||
{
|
{
|
||||||
memcpy (buf + offset, other.buf + other.offset, other.GetLength ());
|
memcpy (buf + offset, other.buf + other.offset, other.GetLength ());
|
||||||
@ -200,8 +209,8 @@ namespace tunnel
|
|||||||
std::shared_ptr<I2NPMessage> NewI2NPShortMessage ();
|
std::shared_ptr<I2NPMessage> NewI2NPShortMessage ();
|
||||||
std::shared_ptr<I2NPMessage> NewI2NPMessage (size_t len);
|
std::shared_ptr<I2NPMessage> NewI2NPMessage (size_t len);
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0);
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, size_t len, uint32_t replyMsgID = 0);
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from = nullptr);
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr<i2p::tunnel::InboundTunnel> from = nullptr);
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID);
|
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID);
|
||||||
std::shared_ptr<I2NPMessage> CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
|
std::shared_ptr<I2NPMessage> CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
|
||||||
|
@ -19,8 +19,8 @@ namespace transport
|
|||||||
*newMsg = *msg;
|
*newMsg = *msg;
|
||||||
msg = newMsg;
|
msg = newMsg;
|
||||||
}
|
}
|
||||||
memcpy (msg->buf + msg->len, fragment, fragmentSize);
|
if (msg->Concat (fragment, fragmentSize) < fragmentSize)
|
||||||
msg->len += fragmentSize;
|
LogPrint (eLogError, "SSU: I2NP buffer overflow ", msg->maxLen);
|
||||||
nextFragmentNum++;
|
nextFragmentNum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,8 +152,8 @@ namespace tunnel
|
|||||||
*newMsg = *(msg.data);
|
*newMsg = *(msg.data);
|
||||||
msg.data = newMsg;
|
msg.data = newMsg;
|
||||||
}
|
}
|
||||||
memcpy (msg.data->buf + msg.data->len, fragment, size); // concatenate fragment
|
if (msg.data->Concat (fragment, size) < size) // concatenate fragment
|
||||||
msg.data->len += size;
|
LogPrint (eLogError, "Tunnel endpoint I2NP buffer overflow ", msg.data->maxLen);
|
||||||
if (isLastFragment)
|
if (isLastFragment)
|
||||||
{
|
{
|
||||||
// message complete
|
// message complete
|
||||||
@ -208,8 +208,8 @@ namespace tunnel
|
|||||||
*newMsg = *(msg.data);
|
*newMsg = *(msg.data);
|
||||||
msg.data = newMsg;
|
msg.data = newMsg;
|
||||||
}
|
}
|
||||||
memcpy (msg.data->buf + msg.data->len, it->second.data->GetBuffer (), size); // concatenate out-of-sync fragment
|
if (msg.data->Concat (it->second.data->GetBuffer (), size) < size) // concatenate out-of-sync fragment
|
||||||
msg.data->len += size;
|
LogPrint (eLogError, "Tunnel endpoint I2NP buffer overflow ", msg.data->maxLen);
|
||||||
if (it->second.isLastFragment)
|
if (it->second.isLastFragment)
|
||||||
{
|
{
|
||||||
// message complete
|
// message complete
|
||||||
|
Loading…
x
Reference in New Issue
Block a user