From 117927bd5f30c8bf09aaf91e62f5244990788084 Mon Sep 17 00:00:00 2001 From: Antoine Poinsot Date: Thu, 16 Mar 2023 10:03:45 +0100 Subject: [PATCH] miniscript: have a custom Node destructor To avoid recursive calls in shared_ptr's destructor that could lead to a stack overflow. --- src/script/miniscript.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/script/miniscript.h b/src/script/miniscript.h index 7585168ec2..48f39262cc 100644 --- a/src/script/miniscript.h +++ b/src/script/miniscript.h @@ -506,10 +506,23 @@ struct Node { //! The data bytes in this expression (only for HASH160/HASH256/SHA256/RIPEMD10). const std::vector data; //! Subexpressions (for WRAP_*/AND_*/OR_*/ANDOR/THRESH) - const std::vector> subs; + mutable std::vector> subs; //! The Script context for this node. Either P2WSH or Tapscript. const MiniscriptContext m_script_ctx; + /* Destroy the shared pointers iteratively to avoid a stack-overflow due to recursive calls + * to the subs' destructors. */ + ~Node() { + while (!subs.empty()) { + auto node = std::move(subs.back()); + subs.pop_back(); + while (!node->subs.empty()) { + subs.push_back(std::move(node->subs.back())); + node->subs.pop_back(); + } + } + } + private: //! Cached ops counts. const internal::Ops ops;