From b2371c4c02ce19a3897c1f978df0a36d6b6e8d38 Mon Sep 17 00:00:00 2001 From: Bart <11445373+bthomee@users.noreply.github.com> Date: Fri, 13 Feb 2026 15:47:08 -0500 Subject: [PATCH] Fixes --- .github/scripts/levelization/results/loops.txt | 2 +- src/test/app/TxQ_test.cpp | 2 +- src/xrpld/app/ledger/detail/InboundLedger.cpp | 15 +++++++++------ src/xrpld/app/ledger/detail/InboundLedgers.cpp | 5 +++-- .../app/ledger/detail/InboundTransactions.cpp | 12 +++++++----- src/xrpld/app/ledger/detail/LedgerNodeHelpers.h | 13 +++++++++++++ 6 files changed, 34 insertions(+), 15 deletions(-) diff --git a/.github/scripts/levelization/results/loops.txt b/.github/scripts/levelization/results/loops.txt index 7914704f9d..aca8af427d 100644 --- a/.github/scripts/levelization/results/loops.txt +++ b/.github/scripts/levelization/results/loops.txt @@ -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 diff --git a/src/test/app/TxQ_test.cpp b/src/test/app/TxQ_test.cpp index 13feceb74e..a97a650ede 100644 --- a/src/test/app/TxQ_test.cpp +++ b/src/test/app/TxQ_test.cpp @@ -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); diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index 578139b4a8..c968cb875e 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -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()) { diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index 394e603c86..ca3ad196d2 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -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); diff --git a/src/xrpld/app/ledger/detail/InboundTransactions.cpp b/src/xrpld/app/ledger/detail/InboundTransactions.cpp index dd076d9aed..50d089ccb2 100644 --- a/src/xrpld/app/ledger/detail/InboundTransactions.cpp +++ b/src/xrpld/app/ledger/detail/InboundTransactions.cpp @@ -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()) diff --git a/src/xrpld/app/ledger/detail/LedgerNodeHelpers.h b/src/xrpld/app/ledger/detail/LedgerNodeHelpers.h index dbbef10579..3de1bcace6 100644 --- a/src/xrpld/app/ledger/detail/LedgerNodeHelpers.h +++ b/src/xrpld/app/ledger/detail/LedgerNodeHelpers.h @@ -22,6 +22,19 @@ validateLedgerNode(Application& app, protocol::TMLedgerNode const& ledger_node) return ledger_node.has_nodeid(); } +inline std::optional> +getTreeNode(Slice const& node_slice) +{ + try + { + return SHAMapTreeNode::makeFromWire(node_slice); + } + catch (...) + { + return std::nullopt; + } +} + inline std::optional getSHAMapNodeID( Application& app,