From 9c607cbd50329f8223ac017571fbe5429af458b6 Mon Sep 17 00:00:00 2001 From: Bart <11445373+bthomee@users.noreply.github.com> Date: Fri, 29 May 2026 13:58:28 -0400 Subject: [PATCH] refactor: Avoid throwing in `visitNodes` when a node is evicted during rotation --- src/libxrpl/shamap/SHAMap.cpp | 5 +---- src/libxrpl/shamap/SHAMapSync.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/libxrpl/shamap/SHAMap.cpp b/src/libxrpl/shamap/SHAMap.cpp index d3a7d49da6..6a9b54eca9 100644 --- a/src/libxrpl/shamap/SHAMap.cpp +++ b/src/libxrpl/shamap/SHAMap.cpp @@ -325,9 +325,6 @@ SHAMap::descend(SHAMapInnerNode& parent, int branch) const return node; node = fetchNode(parent.getChildHash(branch)); - if (!node) - return {}; - node = parent.canonicalizeChild(branch, std::move(node)); return node; } @@ -339,7 +336,7 @@ SHAMap::descendNoStore(SHAMapInnerNode& parent, int branch) const { intr_ptr::SharedPtr ret = parent.getChild(branch); if (!ret && backed_) - ret = fetchNode(parent.getChildHash(branch)); + ret = fetchNodeNT(parent.getChildHash(branch)); return ret; } diff --git a/src/libxrpl/shamap/SHAMapSync.cpp b/src/libxrpl/shamap/SHAMapSync.cpp index cd2654c603..93eb7cd0e7 100644 --- a/src/libxrpl/shamap/SHAMapSync.cpp +++ b/src/libxrpl/shamap/SHAMapSync.cpp @@ -67,6 +67,12 @@ SHAMap::visitNodes(std::function const& function) const if (!node->isEmptyBranch(pos)) { intr_ptr::SharedPtr const child = descendNoStore(*node, pos); + if (!child) + { + // Node was evicted after rotation; skip this subtree. + ++pos; + continue; + } if (!function(*child)) return;