From 9a10148c019add4ba7928271b951fb65fd7fe838 Mon Sep 17 00:00:00 2001
From: moneromooo-monero <moneromooo-monero@users.noreply.github.com>
Date: Fri, 28 Jul 2017 22:23:05 +0100
Subject: [PATCH 1/2] p2p: fix thread leak

---
 src/p2p/net_node.inl | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index b23090c7d..4ecf8f710 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -444,11 +444,11 @@ namespace nodetool
       std::vector<std::vector<std::string>> dns_results;
       dns_results.resize(m_seed_nodes_list.size());
 
-      std::list<boost::thread*> dns_threads;
+      std::list<boost::thread> dns_threads;
       uint64_t result_index = 0;
       for (const std::string& addr_str : m_seed_nodes_list)
       {
-        boost::thread* th = new boost::thread([=, &dns_results, &addr_str]
+        boost::thread th = boost::thread([=, &dns_results, &addr_str]
         {
           MDEBUG("dns_threads[" << result_index << "] created for: " << addr_str);
           // TODO: care about dnssec avail/valid
@@ -474,19 +474,19 @@ namespace nodetool
           dns_results[result_index] = addr_list;
         });
 
-        dns_threads.push_back(th);
+        dns_threads.push_back(std::move(th));
         ++result_index;
       }
 
       MDEBUG("dns_threads created, now waiting for completion or timeout of " << CRYPTONOTE_DNS_TIMEOUT_MS << "ms");
       boost::chrono::system_clock::time_point deadline = boost::chrono::system_clock::now() + boost::chrono::milliseconds(CRYPTONOTE_DNS_TIMEOUT_MS);
       uint64_t i = 0;
-      for (boost::thread* th : dns_threads)
+      for (boost::thread& th : dns_threads)
       {
-        if (! th->try_join_until(deadline))
+        if (! th.try_join_until(deadline))
         {
           MWARNING("dns_threads[" << i << "] timed out, sending interrupt");
-          th->interrupt();
+          th.interrupt();
         }
         ++i;
       }

From 04ebfbfefa1ae27a3d92d9f78548ca595687fe01 Mon Sep 17 00:00:00 2001
From: moneromooo-monero <moneromooo-monero@users.noreply.github.com>
Date: Sat, 29 Jul 2017 10:03:37 +0100
Subject: [PATCH 2/2] p2p: close connections when exiting

This ensures they don't leak if they were in the middle of an
async operation.
---
 src/p2p/net_node.inl | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 4ecf8f710..5bc9cd48f 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -714,6 +714,14 @@ namespace nodetool
   template<class t_payload_net_handler>
   bool node_server<t_payload_net_handler>::send_stop_signal()
   {
+    std::list<boost::uuids::uuid> connection_ids;
+    m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt) {
+      connection_ids.push_back(cntxt.m_connection_id);
+      return true;
+    });
+    for (const auto &connection_id: connection_ids)
+      m_net_server.get_config_object().close(connection_id);
+
     m_payload_handler.stop();
     m_net_server.send_stop_signal();
     MDEBUG("[node] Stop signal sent");