This commit is contained in:
Bart
2026-02-13 15:47:08 -05:00
parent b94a7c4b44
commit b2371c4c02
6 changed files with 34 additions and 15 deletions

View File

@@ -5,7 +5,7 @@ Loop: test.jtx test.unit_test
test.unit_test == test.jtx
Loop: xrpld.app xrpld.overlay
xrpld.overlay ~= xrpld.app
xrpld.overlay == xrpld.app
Loop: xrpld.app xrpld.peerfinder
xrpld.peerfinder == xrpld.app

View File

@@ -1010,7 +1010,7 @@ public:
// Charlie - queue a transaction, with a higher fee
// than default
env(noop(charlie), fee(15), queued);
checkMetrics(*this, env, 6, initQueueMax, 4, 3, 257);
checkMetrics(*this, env, 6, initQueueMax, 4, 3, 256);
BEAST_EXPECT(env.seq(alice) == aliceSeq);
BEAST_EXPECT(env.seq(bob) == bobSeq);

View File

@@ -825,30 +825,33 @@ InboundLedger::receiveNode(protocol::TMLedgerData& packet, SHAMapAddNode& san)
if (!validateLedgerNode(app_, ledger_node))
{
JLOG(journal_.warn()) << "Got malformed ledger node";
san.incInvalid();
return;
}
auto const node_slice = makeSlice(ledger_node.nodedata());
auto const tree_node = SHAMapTreeNode::makeFromWire(node_slice);
if (!tree_node)
auto const tree_node_opt = getTreeNode(node_slice);
if (!tree_node_opt)
{
JLOG(journal_.warn()) << "Got invalid node data";
san.incInvalid();
return;
}
auto const tree_node = *tree_node_opt;
auto const& node_id = getSHAMapNodeID(app_, ledger_node, tree_node);
if (!node_id)
auto const node_id_opt = getSHAMapNodeID(app_, ledger_node, tree_node);
if (!node_id_opt)
{
JLOG(journal_.warn()) << "Got invalid node id";
san.incInvalid();
return;
}
auto const& node_id = *node_id_opt;
if (node_id->isRoot())
if (node_id.isRoot())
san += map.addRootNode(rootHash, node_slice, f);
else
san += map.addKnownNode(*node_id, node_slice, f);
san += map.addKnownNode(node_id, node_slice, f);
if (!san.isGood())
{

View File

@@ -222,9 +222,10 @@ public:
return;
auto const node_slice = makeSlice(ledger_node.nodedata());
auto const tree_node = SHAMapTreeNode::makeFromWire(node_slice);
if (!tree_node)
auto const tree_node_opt = getTreeNode(node_slice);
if (!tree_node_opt)
return;
auto const tree_node = *tree_node_opt;
s.erase();
tree_node->serializeWithPrefix(s);

View File

@@ -141,23 +141,25 @@ public:
}
auto const node_slice = makeSlice(ledger_node.nodedata());
auto const tree_node = SHAMapTreeNode::makeFromWire(node_slice);
if (!tree_node)
auto const tree_node_opt = getTreeNode(node_slice);
if (!tree_node_opt)
{
JLOG(j_.warn()) << "Got invalid node data";
peer->charge(Resource::feeInvalidData, "node_data");
return;
}
auto const tree_node = *tree_node_opt;
auto const& node_id = getSHAMapNodeID(app_, ledger_node, tree_node);
if (!node_id)
auto const node_id_opt = getSHAMapNodeID(app_, ledger_node, tree_node);
if (!node_id_opt)
{
JLOG(j_.warn()) << "Got invalid node id";
peer->charge(Resource::feeInvalidData, "node_id");
return;
}
auto const& node_id = *node_id_opt;
data.emplace_back(std::make_pair(*node_id, node_slice));
data.emplace_back(std::make_pair(node_id, node_slice));
}
if (!ta->takeNodes(data, peer).isUseful())

View File

@@ -22,6 +22,19 @@ validateLedgerNode(Application& app, protocol::TMLedgerNode const& ledger_node)
return ledger_node.has_nodeid();
}
inline std::optional<intr_ptr::SharedPtr<SHAMapTreeNode>>
getTreeNode(Slice const& node_slice)
{
try
{
return SHAMapTreeNode::makeFromWire(node_slice);
}
catch (...)
{
return std::nullopt;
}
}
inline std::optional<SHAMapNodeID>
getSHAMapNodeID(
Application& app,