Browse Source

correct parsing of caught RouterInfo at IBGW and OBEP

pull/1919/head
orignal 2 years ago
parent
commit
ead6a6dca3
  1. 21
      libi2pd/NetDb.cpp
  2. 2
      libi2pd/Tunnel.cpp
  3. 2
      libi2pd/TunnelEndpoint.cpp

21
libi2pd/NetDb.cpp

@ -791,19 +791,22 @@ namespace data
LogPrint (eLogError, "NetDb: Database store msg with reply token is too short ", len, ". Dropped"); LogPrint (eLogError, "NetDb: Database store msg with reply token is too short ", len, ". Dropped");
return; return;
} }
auto deliveryStatus = CreateDeliveryStatusMsg (replyToken);
uint32_t tunnelID = bufbe32toh (buf + offset); uint32_t tunnelID = bufbe32toh (buf + offset);
offset += 4; offset += 4;
if (!tunnelID) // send response directly if (replyToken != 0xFFFFFFFFU) // if not caught on OBEP or IBGW
transports.SendMessage (buf + offset, deliveryStatus);
else
{ {
auto pool = i2p::tunnel::tunnels.GetExploratoryPool (); auto deliveryStatus = CreateDeliveryStatusMsg (replyToken);
auto outbound = pool ? pool->GetNextOutboundTunnel () : nullptr; if (!tunnelID) // send response directly
if (outbound) transports.SendMessage (buf + offset, deliveryStatus);
outbound->SendTunnelDataMsgTo (buf + offset, tunnelID, deliveryStatus);
else else
LogPrint (eLogWarning, "NetDb: No outbound tunnels for DatabaseStore reply found"); {
auto pool = i2p::tunnel::tunnels.GetExploratoryPool ();
auto outbound = pool ? pool->GetNextOutboundTunnel () : nullptr;
if (outbound)
outbound->SendTunnelDataMsgTo (buf + offset, tunnelID, deliveryStatus);
else
LogPrint (eLogWarning, "NetDb: No outbound tunnels for DatabaseStore reply found");
}
} }
offset += 32; offset += 32;
} }

2
libi2pd/Tunnel.cpp

@ -593,7 +593,7 @@ namespace tunnel
{ {
// transit DatabaseStore might contain new/updated RI // transit DatabaseStore might contain new/updated RI
auto m = CopyI2NPMessage (msg); auto m = CopyI2NPMessage (msg);
memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0, 4); // no reply memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0xFF, 4); // fake replyToken meaning no reply
i2p::data::netdb.PostI2NPMsg (m); i2p::data::netdb.PostI2NPMsg (m);
} }
tunnel->SendTunnelDataMsg (msg); tunnel->SendTunnelDataMsg (msg);

2
libi2pd/TunnelEndpoint.cpp

@ -331,7 +331,7 @@ namespace tunnel
else if (IsRouterInfoMsg (msg.data)) else if (IsRouterInfoMsg (msg.data))
{ {
auto m = CopyI2NPMessage (msg.data); auto m = CopyI2NPMessage (msg.data);
memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0, 4); // no reply memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0xFF, 4); // fake replyToken meaning no reply
i2p::data::netdb.PostI2NPMsg (m); i2p::data::netdb.PostI2NPMsg (m);
} }
} }

Loading…
Cancel
Save