From f3b65c66f8f95a299ef0746f60ccf3fb250e128a Mon Sep 17 00:00:00 2001
From: Martijn Otto <git@martijnotto.nl>
Date: Wed, 25 Sep 2019 16:37:06 +0200
Subject: [PATCH] Request a thread stack size that is large enough for unbound

Unbound uses a 64 kb large character array on the stack, which
leads to a stack overflow for some libc implementations. musl
only gives 80 kb in total. This PR changes the stack size for
these threads to 1mb, which solves the segmentation fault.
---
 src/p2p/net_node.inl | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 8c0cff7e2..5cdbc2ce6 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -645,11 +645,18 @@ namespace nodetool
       std::vector<std::vector<std::string>> dns_results;
       dns_results.resize(m_seed_nodes_list.size());
 
+      // some libc implementation provide only a very small stack
+      // for threads, e.g. musl only gives +- 80kb, which is not
+      // enough to do a resolve with unbound. we request a stack
+      // of 1 mb, which should be plenty
+      boost::thread::attributes thread_attributes;
+      thread_attributes.set_stack_size(1024*1024);
+
       std::list<boost::thread> dns_threads;
       uint64_t result_index = 0;
       for (const std::string& addr_str : m_seed_nodes_list)
       {
-        boost::thread th = boost::thread([=, &dns_results, &addr_str]
+        boost::thread th = boost::thread(thread_attributes, [=, &dns_results, &addr_str]
         {
           MDEBUG("dns_threads[" << result_index << "] created for: " << addr_str);
           // TODO: care about dnssec avail/valid