Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Martijn Otto committed Sep 25, 2019
1 parent 174c3a0 commit f3b65c6
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/p2p/net_node.inl
Expand Up @@ -645,11 +645,18 @@ namespace nodetool
std::vector<std::vector<std::string>> dns_results; std::vector<std::vector<std::string>> dns_results;
dns_results.resize(m_seed_nodes_list.size()); 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; std::list<boost::thread> dns_threads;
uint64_t result_index = 0; uint64_t result_index = 0;
for (const std::string& addr_str : m_seed_nodes_list) 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); MDEBUG("dns_threads[" << result_index << "] created for: " << addr_str);
// TODO: care about dnssec avail/valid // TODO: care about dnssec avail/valid
Expand Down

0 comments on commit f3b65c6

Please sign in to comment.