diff --git a/Datagram.cpp b/Datagram.cpp index e065e3e7..b944cf11 100644 --- a/Datagram.cpp +++ b/Datagram.cpp @@ -48,15 +48,13 @@ namespace datagram m_Owner->RequestDestination (ident, std::bind (&DatagramDestination::HandleLeaseSetRequestComplete, this, std::placeholders::_1, msg)); } - void DatagramDestination::HandleLeaseSetRequestComplete (std::shared_ptr remote, I2NPMessage * msg) + void DatagramDestination::HandleLeaseSetRequestComplete (std::shared_ptr remote, std::shared_ptr msg) { if (remote) SendMsg (msg, remote); - else - DeleteI2NPMessage (msg); } - void DatagramDestination::SendMsg (I2NPMessage * msg, std::shared_ptr remote) + void DatagramDestination::SendMsg (std::shared_ptr msg, std::shared_ptr remote) { auto outboundTunnel = m_Owner->GetTunnelPool ()->GetNextOutboundTunnel (); auto leases = remote->GetNonExpiredLeases (); @@ -64,7 +62,7 @@ namespace datagram { std::vector msgs; uint32_t i = rand () % leases.size (); - auto garlic = m_Owner->WrapMessage (remote, ToSharedI2NPMessage (msg), true); + auto garlic = m_Owner->WrapMessage (remote, msg, true); msgs.push_back (i2p::tunnel::TunnelMessageBlock { i2p::tunnel::eDeliveryTypeTunnel, @@ -79,7 +77,6 @@ namespace datagram LogPrint (eLogWarning, "Failed to send datagram. All leases expired"); else LogPrint (eLogWarning, "Failed to send datagram. No outbound tunnels"); - DeleteI2NPMessage (msg); } } @@ -123,9 +120,9 @@ namespace datagram HandleDatagram (fromPort, toPort, uncompressed, uncompressedLen); } - I2NPMessage * DatagramDestination::CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort) + std::shared_ptr DatagramDestination::CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort) { - I2NPMessage * msg = NewI2NPMessage (); + auto msg = NewI2NPMessage (); uint8_t * buf = msg->GetPayload (); buf += 4; // reserve for length size_t size = m_Deflator.Deflate (payload, len, buf, msg->maxLen - msg->len); @@ -139,10 +136,7 @@ namespace datagram msg->FillI2NPMessageHeader (eI2NPData); } else - { - DeleteI2NPMessage (msg); msg = nullptr; - } return msg; } } diff --git a/Datagram.h b/Datagram.h index 7f6df921..c593fad2 100644 --- a/Datagram.h +++ b/Datagram.h @@ -39,10 +39,10 @@ namespace datagram private: - void HandleLeaseSetRequestComplete (std::shared_ptr leaseSet, I2NPMessage * msg); + void HandleLeaseSetRequestComplete (std::shared_ptr leaseSet, std::shared_ptr msg); - I2NPMessage * CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort); - void SendMsg (I2NPMessage * msg, std::shared_ptr remote); + std::shared_ptr CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort); + void SendMsg (std::shared_ptr msg, std::shared_ptr remote); void HandleDatagram (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len); private: diff --git a/Garlic.cpp b/Garlic.cpp index f8acbe39..c94139e0 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -112,7 +112,7 @@ namespace garlic std::shared_ptr GarlicRoutingSession::WrapSingleMessage (std::shared_ptr msg) { - auto m = ToSharedI2NPMessage(NewI2NPMessage ()); + auto m = NewI2NPMessage (); m->Align (12); // in order to get buf aligned to 16 (12 + 4) size_t len = 0; uint8_t * buf = m->GetPayload () + 4; // 4 bytes for length diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 890ec6af..6f7c98f5 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -18,30 +18,20 @@ using namespace i2p::transport; namespace i2p { - I2NPMessage * NewI2NPMessage () + std::shared_ptr NewI2NPMessage () { - return new I2NPMessageBuffer(); + return std::make_shared >(); } - I2NPMessage * NewI2NPShortMessage () + std::shared_ptr NewI2NPShortMessage () { - return new I2NPMessageBuffer(); + return std::make_shared >(); } - I2NPMessage * NewI2NPMessage (size_t len) + std::shared_ptr NewI2NPMessage (size_t len) { return (len < I2NP_MAX_SHORT_MESSAGE_SIZE/2) ? NewI2NPShortMessage () : NewI2NPMessage (); } - - void DeleteI2NPMessage (I2NPMessage * msg) - { - delete msg; - } - - std::shared_ptr ToSharedI2NPMessage (I2NPMessage * msg) - { - return std::shared_ptr(msg, DeleteI2NPMessage); - } void I2NPMessage::FillI2NPMessageHeader (I2NPMessageType msgType, uint32_t replyMsgID) { @@ -61,9 +51,9 @@ namespace i2p SetExpiration (i2p::util::GetMillisecondsSinceEpoch () + 5000); } - I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID) + std::shared_ptr CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID) { - I2NPMessage * msg = NewI2NPMessage (len); + auto msg = NewI2NPMessage (len); if (msg->len + len < msg->maxLen) { memcpy (msg->GetPayload (), buf, len); @@ -77,7 +67,7 @@ namespace i2p std::shared_ptr CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr from) { - I2NPMessage * msg = NewI2NPMessage (); + auto msg = NewI2NPMessage (); if (msg->offset + len < msg->maxLen) { memcpy (msg->GetBuffer (), buf, len); @@ -86,12 +76,12 @@ namespace i2p } else LogPrint (eLogError, "I2NP message length ", len, " exceeds max length"); - return ToSharedI2NPMessage(msg); + return msg; } std::shared_ptr CreateDeliveryStatusMsg (uint32_t msgID) { - I2NPMessage * m = NewI2NPShortMessage (); + auto m = NewI2NPShortMessage (); uint8_t * buf = m->GetPayload (); if (msgID) { @@ -106,13 +96,13 @@ namespace i2p } m->len += DELIVERY_STATUS_SIZE; m->FillI2NPMessageHeader (eI2NPDeliveryStatus); - return ToSharedI2NPMessage (m); + return m; } std::shared_ptr CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, uint32_t replyTunnelID, bool exploratory, std::set * excludedPeers) { - auto m = ToSharedI2NPMessage (excludedPeers ? NewI2NPMessage () : NewI2NPShortMessage ()); + auto m = excludedPeers ? NewI2NPMessage () : NewI2NPShortMessage (); uint8_t * buf = m->GetPayload (); memcpy (buf, key, 32); // key buf += 32; @@ -159,7 +149,7 @@ namespace i2p const i2p::tunnel::InboundTunnel * replyTunnel, const uint8_t * replyKey, const uint8_t * replyTag) { int cnt = excludedFloodfills.size (); - auto m = ToSharedI2NPMessage (cnt > 0 ? NewI2NPMessage () : NewI2NPShortMessage ()); + auto m = cnt > 0 ? NewI2NPMessage () : NewI2NPShortMessage (); uint8_t * buf = m->GetPayload (); memcpy (buf, dest, 32); // key buf += 32; @@ -194,7 +184,7 @@ namespace i2p std::shared_ptr CreateDatabaseSearchReply (const i2p::data::IdentHash& ident, std::vector routers) { - auto m = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto m = NewI2NPShortMessage (); uint8_t * buf = m->GetPayload (); size_t len = 0; memcpy (buf, ident, 32); @@ -218,7 +208,7 @@ namespace i2p if (!router) // we send own RouterInfo router = context.GetSharedRouterInfo (); - auto m = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto m = NewI2NPShortMessage (); uint8_t * payload = m->GetPayload (); memcpy (payload + DATABASE_STORE_KEY_OFFSET, router->GetIdentHash (), 32); @@ -253,7 +243,7 @@ namespace i2p std::shared_ptr CreateDatabaseStoreMsg (std::shared_ptr leaseSet, uint32_t replyToken) { if (!leaseSet) return nullptr; - auto m = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto m = NewI2NPShortMessage (); uint8_t * payload = m->GetPayload (); memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetIdentHash (), 32); payload[DATABASE_STORE_TYPE_OFFSET] = 1; // LeaseSet @@ -358,14 +348,14 @@ namespace i2p { // so we send it to reply tunnel transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, - ToSharedI2NPMessage (CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), + CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), eI2NPVariableTunnelBuildReply, buf, len, - bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)))); + bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))); } else transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, - ToSharedI2NPMessage (CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len, - bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)))); + CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len, + bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))); } } } @@ -379,14 +369,14 @@ namespace i2p { // so we send it to reply tunnel transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, - ToSharedI2NPMessage (CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), + CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), eI2NPTunnelBuildReply, buf, len, - bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)))); + bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))); } else transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, - ToSharedI2NPMessage (CreateI2NPMessage (eI2NPTunnelBuild, buf, len, - bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)))); + CreateI2NPMessage (eI2NPTunnelBuild, buf, len, + bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))); } } @@ -414,18 +404,18 @@ namespace i2p } - I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf) + std::shared_ptr CreateTunnelDataMsg (const uint8_t * buf) { - I2NPMessage * msg = NewI2NPShortMessage (); + auto msg = NewI2NPShortMessage (); memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE); msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE; msg->FillI2NPMessageHeader (eI2NPTunnelData); return msg; } - I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload) + std::shared_ptr CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload) { - I2NPMessage * msg = NewI2NPShortMessage (); + auto msg = NewI2NPShortMessage (); memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4); htobe32buf (msg->GetPayload (), tunnelID); msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE; @@ -435,14 +425,14 @@ namespace i2p std::shared_ptr CreateEmptyTunnelDataMsg () { - I2NPMessage * msg = NewI2NPShortMessage (); + auto msg = NewI2NPShortMessage (); msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE; - return ToSharedI2NPMessage (msg); + return msg; } - I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len) + std::shared_ptr CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len) { - I2NPMessage * msg = NewI2NPMessage (len); + auto msg = NewI2NPMessage (len); uint8_t * payload = msg->GetPayload (); htobe32buf (payload + TUNNEL_GATEWAY_HEADER_TUNNELID_OFFSET, tunnelID); htobe16buf (payload + TUNNEL_GATEWAY_HEADER_LENGTH_OFFSET, len); @@ -467,16 +457,13 @@ namespace i2p return msg; } else - { - I2NPMessage * msg1 = CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ()); - return ToSharedI2NPMessage (msg1); - } + return CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ()); } - I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, + std::shared_ptr CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, const uint8_t * buf, size_t len, uint32_t replyMsgID) { - I2NPMessage * msg = NewI2NPMessage (len); + auto msg = NewI2NPMessage (len); size_t gatewayMsgOffset = I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE; msg->offset += gatewayMsgOffset; msg->len += gatewayMsgOffset; diff --git a/I2NPProtocol.h b/I2NPProtocol.h index a4840217..a3f75d7a 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -196,13 +196,11 @@ namespace tunnel uint8_t m_Buffer[sz + 16]; }; - I2NPMessage * NewI2NPMessage (); - I2NPMessage * NewI2NPShortMessage (); - I2NPMessage * NewI2NPMessage (size_t len); - void DeleteI2NPMessage (I2NPMessage * msg); - std::shared_ptr ToSharedI2NPMessage (I2NPMessage * msg); + std::shared_ptr NewI2NPMessage (); + std::shared_ptr NewI2NPShortMessage (); + std::shared_ptr NewI2NPMessage (size_t len); - I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0); + std::shared_ptr CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0); std::shared_ptr CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr from = nullptr); std::shared_ptr CreateDeliveryStatusMsg (uint32_t msgID); @@ -221,12 +219,12 @@ namespace tunnel void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len); void HandleTunnelBuildMsg (uint8_t * buf, size_t len); - I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf); - I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload); + std::shared_ptr CreateTunnelDataMsg (const uint8_t * buf); + std::shared_ptr CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload); std::shared_ptr CreateEmptyTunnelDataMsg (); - I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len); - I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, + std::shared_ptr CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len); + std::shared_ptr CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, const uint8_t * buf, size_t len, uint32_t replyMsgID = 0); std::shared_ptr CreateTunnelGatewayMsg (uint32_t tunnelID, std::shared_ptr msg); diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 70fb8d25..9de41727 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -555,7 +555,7 @@ namespace transport return false; } auto msg = dataSize <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage (); - m_NextMessage = ToSharedI2NPMessage (msg); + m_NextMessage = msg; memcpy (m_NextMessage->buf, buf, 16); m_NextMessageOffset = 16; m_NextMessage->offset = 2; // size field diff --git a/NetDb.cpp b/NetDb.cpp index 5517ffdf..bf9a64f0 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -478,7 +478,7 @@ namespace data if (context.IsFloodfill ()) { // flood it - auto floodMsg = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto floodMsg = NewI2NPShortMessage (); uint8_t * payload = floodMsg->GetPayload (); memcpy (payload, buf, 33); // key + type htobe32buf (payload + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0); // zero reply token diff --git a/SSUData.cpp b/SSUData.cpp index 77c2470f..1106cf89 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -15,7 +15,7 @@ namespace transport if (msg->len + fragmentSize > msg->maxLen) { LogPrint (eLogInfo, "SSU I2NP message size ", msg->maxLen, " is not enough"); - auto newMsg = ToSharedI2NPMessage(NewI2NPMessage ()); + auto newMsg = NewI2NPMessage (); *newMsg = *msg; msg = newMsg; } @@ -171,7 +171,7 @@ namespace transport if (it == m_IncompleteMessages.end ()) { // create new message - auto msg = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto msg = NewI2NPShortMessage (); msg->len -= I2NP_SHORT_HEADER_SIZE; it = m_IncompleteMessages.insert (std::make_pair (msgID, std::unique_ptr(new IncompleteMessage (msg)))).first; diff --git a/Streaming.cpp b/Streaming.cpp index bb84a955..0b4e514d 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -764,7 +764,7 @@ namespace stream std::shared_ptr Stream::CreateDataMessage (const uint8_t * payload, size_t len) { - auto msg = ToSharedI2NPMessage (NewI2NPShortMessage ()); + auto msg = NewI2NPShortMessage (); if (len <= i2p::stream::COMPRESSION_THRESHOLD_SIZE) m_LocalDestination.m_Deflator.SetCompressionLevel (Z_NO_COMPRESSION); else diff --git a/Tunnel.cpp b/Tunnel.cpp index 375fe6b0..b899fdf7 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -85,9 +85,9 @@ namespace tunnel // send message if (outboundTunnel) - outboundTunnel->SendTunnelDataMsg (GetNextIdentHash (), 0, ToSharedI2NPMessage (msg)); + outboundTunnel->SendTunnelDataMsg (GetNextIdentHash (), 0, msg); else - i2p::transport::transports.SendMessage (GetNextIdentHash (), ToSharedI2NPMessage (msg)); + i2p::transport::transports.SendMessage (GetNextIdentHash (), msg); } bool Tunnel::HandleTunnelBuildResponse (uint8_t * msg, size_t len) diff --git a/TunnelEndpoint.cpp b/TunnelEndpoint.cpp index fe161652..6f765a86 100644 --- a/TunnelEndpoint.cpp +++ b/TunnelEndpoint.cpp @@ -93,7 +93,7 @@ namespace tunnel if (fragment + size < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE) { // this is not last message. we have to copy it - m.data = ToSharedI2NPMessage (NewI2NPShortMessage ()); + m.data = NewI2NPShortMessage (); m.data->offset += TUNNEL_GATEWAY_HEADER_SIZE; // reserve room for TunnelGateway header m.data->len += TUNNEL_GATEWAY_HEADER_SIZE; *(m.data) = *msg; @@ -148,7 +148,7 @@ namespace tunnel if (msg.data->len + size > msg.data->maxLen) { LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough"); - auto newMsg = ToSharedI2NPMessage (NewI2NPMessage ()); + auto newMsg = NewI2NPMessage (); *newMsg = *(msg.data); msg.data = newMsg; } @@ -204,7 +204,7 @@ namespace tunnel if (msg.data->len + size > msg.data->maxLen) { LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough"); - auto newMsg = ToSharedI2NPMessage (NewI2NPMessage ()); + auto newMsg = NewI2NPMessage (); *newMsg = *(msg.data); msg.data = newMsg; } diff --git a/TunnelGateway.cpp b/TunnelGateway.cpp index adc1bef6..4f517eb8 100644 --- a/TunnelGateway.cpp +++ b/TunnelGateway.cpp @@ -143,7 +143,7 @@ namespace tunnel void TunnelGatewayBuffer::CreateCurrentTunnelDataMessage () { - m_CurrentTunnelDataMsg = ToSharedI2NPMessage (NewI2NPShortMessage ()); + m_CurrentTunnelDataMsg = NewI2NPShortMessage (); m_CurrentTunnelDataMsg->Align (12); // we reserve space for padding m_CurrentTunnelDataMsg->offset += TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE;