From a39e2443a00b8e3b0f9034fec3718a3804926e9d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Sun, 9 Feb 2020 00:51:58 -0500
Subject: [PATCH] dht: reuse probe query, avoid leak

---
 src/dht.cpp | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/dht.cpp b/src/dht.cpp
index 315742c4..be6fefa9 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -487,15 +487,16 @@ void Dht::searchSendAnnounceValue(const Sp<Search>& sr) {
         }
     };
 
-    Sp<Query> probe_query {};
+    static const auto PROBE_QUERY = std::make_shared<Query>(Select {}.field(Value::Field::Id).field(Value::Field::SeqNum));
+
     const auto& now = scheduler.time();
     for (auto& np : sr->nodes) {
         auto& n = *np;
         if (not n.isSynced(now))
             continue;
 
-        const auto& gs = n.probe_query ? n.getStatus.find(n.probe_query) : n.getStatus.cend();
-        if (gs != n.getStatus.cend() and gs->second and gs->second->pending()) {
+        auto gs = n.probe_query ? n.getStatus.find(n.probe_query) : n.getStatus.end();
+        if (gs != n.getStatus.end() and gs->second and gs->second->pending()) {
             continue;
         }
 
@@ -517,18 +518,19 @@ void Dht::searchSendAnnounceValue(const Sp<Search>& sr) {
         }
 
         if (sendQuery) {
-            if (not probe_query)
-                probe_query = std::make_shared<Query>(Select {}.field(Value::Field::Id).field(Value::Field::SeqNum));
+            if (gs == n.getStatus.cend()) {
+                n.probe_query = PROBE_QUERY;
+                gs = n.getStatus.emplace(n.probe_query, Sp<net::Request>()).first;
+            }
             if (logger_)
                 logger_->d(sr->id, n.node->id, "[search %s] [node %s] sending %s",
-                    sr->id.toString().c_str(), n.node->toString().c_str(), probe_query->toString().c_str());
-            n.probe_query = probe_query;
-            n.getStatus[probe_query] = network_engine.sendGetValues(n.node,
+                    sr->id.toString().c_str(), n.node->toString().c_str(), n.probe_query->toString().c_str());
+            gs->second = network_engine.sendGetValues(n.node,
                     sr->id,
-                    *probe_query,
+                    *PROBE_QUERY,
                     -1,
                     onSelectDone,
-                    std::bind(&Dht::searchNodeGetExpired, this, _1, _2, ws, probe_query));
+                    std::bind(&Dht::searchNodeGetExpired, this, _1, _2, ws, PROBE_QUERY));
         }
         if (not n.candidate and ++i == TARGET_NODES)
             break;
-- 
GitLab