miniscript: have a custom Node destructor

To avoid recursive calls in shared_ptr's destructor that could lead to a
stack overflow.
This commit is contained in:
Antoine Poinsot committed 2023-10-08 02:43:26 +02:00
1 parent b917c715ac
commit 117927bd5f
1 file changed
+14 -1
+14 -1
View File
@@ -506,10 +506,23 @@ struct Node {
//! The data bytes in this expression (only for HASH160/HASH256/SHA256/RIPEMD10).
const std::vector<unsigned char> data;
//! Subexpressions (for WRAP_*/AND_*/OR_*/ANDOR/THRESH)
const std::vector<NodeRef<Key>> subs;
mutable std::vector<NodeRef<Key>> 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;