From bc168453dd7e90908ce62ee36f1692125e87e297 Mon Sep 17 00:00:00 2001 From: Valentin Balaschenko <13349202+vlntb@users.noreply.github.com> Date: Wed, 15 Apr 2026 20:00:28 +0100 Subject: [PATCH] refactor: Use named constant for leaf item size (#39) --- src/xrpld/shamap/SHAMapTreeNode.h | 3 +++ src/xrpld/shamap/detail/SHAMapLeafNode.cpp | 4 ++-- src/xrpld/shamap/detail/SHAMapTreeNode.cpp | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/xrpld/shamap/SHAMapTreeNode.h b/src/xrpld/shamap/SHAMapTreeNode.h index 2c4a349019..5242e83348 100644 --- a/src/xrpld/shamap/SHAMapTreeNode.h +++ b/src/xrpld/shamap/SHAMapTreeNode.h @@ -41,6 +41,9 @@ static constexpr unsigned char const wireTypeInner = 2; static constexpr unsigned char const wireTypeCompressedInner = 3; static constexpr unsigned char const wireTypeTransactionWithMeta = 4; +// Lower-bound sanity check for SHAMap leaf payloads. +inline constexpr std::size_t minSHAMapItemBytes = 12; + enum class SHAMapNodeType { tnINNER = 1, tnTRANSACTION_NM = 2, // transaction, no metadata diff --git a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp index 10d61ff138..169c327455 100644 --- a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp @@ -27,7 +27,7 @@ SHAMapLeafNode::SHAMapLeafNode( : SHAMapTreeNode(cowid), item_(std::move(item)) { XRPL_ASSERT( - item_->size() >= 12, + item_->size() >= minSHAMapItemBytes, "ripple::SHAMapLeafNode::SHAMapLeafNode(boost::intrusive_ptr<" "SHAMapItem const>, std::uint32_t) : minimum input size"); } @@ -39,7 +39,7 @@ SHAMapLeafNode::SHAMapLeafNode( : SHAMapTreeNode(cowid, hash), item_(std::move(item)) { XRPL_ASSERT( - item_->size() >= 12, + item_->size() >= minSHAMapItemBytes, "ripple::SHAMapLeafNode::SHAMapLeafNode(boost::intrusive_ptr<" "SHAMapItem const>, std::uint32_t, SHAMapHash const&) : minimum input " "size"); diff --git a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp index d1e74fd6a7..c70bddb23a 100644 --- a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp @@ -38,6 +38,12 @@ SHAMapTreeNode::makeTransaction( SHAMapHash const& hash, bool hashValid) { + if (data.size() < minSHAMapItemBytes) + Throw( + "Short TXN node: " + std::to_string(data.size()) + + " bytes (minimum " + std::to_string(minSHAMapItemBytes) + + " required)"); + auto item = make_shamapitem(sha512Half(HashPrefix::transactionID, data), data); @@ -68,6 +74,12 @@ SHAMapTreeNode::makeTransactionWithMeta( s.chop(tag.bytes); + if (s.size() < minSHAMapItemBytes) + Throw( + "Short TXN+MD node: " + std::to_string(s.size()) + + " bytes after tag removal (minimum " + + std::to_string(minSHAMapItemBytes) + " required)"); + auto item = make_shamapitem(tag, s.slice()); if (hashValid) @@ -100,6 +112,12 @@ SHAMapTreeNode::makeAccountState( if (tag.isZero()) Throw("Invalid AS node"); + if (s.size() < minSHAMapItemBytes) + Throw( + "Short AS node: " + std::to_string(s.size()) + + " bytes after tag removal (minimum " + + std::to_string(minSHAMapItemBytes) + " required)"); + auto item = make_shamapitem(tag, s.slice()); if (hashValid)