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;