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.
This commit is contained in:
Martijn Otto 2019-09-25 16:37:06 +02:00
parent 174c3a05f6
commit f3b65c66f8
No known key found for this signature in database
GPG Key ID: D2E0D5D0B1D606F9
1 changed files with 8 additions and 1 deletions

View File

@ -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