From 63afc8c29a01f4b062b596608e0a5886e4f05a18 Mon Sep 17 00:00:00 2001
From: Seva <seva@binarytrails.net>
Date: Mon, 9 Sep 2019 16:00:44 -0400
Subject: [PATCH] http: fix resolver destruction race condition

---
 include/opendht/http.h |  1 +
 src/http.cpp           | 11 ++++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/include/opendht/http.h b/include/opendht/http.h
index 2812228a..1626e0c3 100644
--- a/include/opendht/http.h
+++ b/include/opendht/http.h
@@ -171,6 +171,7 @@ private:
     Url url_;
     asio::error_code ec_;
     asio::ip::tcp::resolver resolver_;
+    std::shared_ptr<bool> destroyed_;
     std::vector<asio::ip::tcp::endpoint> endpoints_;
 
     bool completed_ {false};
diff --git a/src/http.cpp b/src/http.cpp
index 9a54266e..5970fe03 100644
--- a/src/http.cpp
+++ b/src/http.cpp
@@ -301,14 +301,14 @@ Connection::timeout(const std::chrono::seconds timeout, HandlerCb cb)
 // Resolver
 
 Resolver::Resolver(asio::io_context& ctx, const std::string& url, std::shared_ptr<dht::Logger> logger)
-    : url_(url), resolver_(ctx), logger_(logger)
+    : url_(url), resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger)
 {
     resolve(url_.host, url_.service);
 }
 
 Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service,
                    const bool ssl, std::shared_ptr<dht::Logger> logger)
-    : resolver_(ctx), logger_(logger)
+    : resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger)
 {
     url_.host = host;
     url_.service = service;
@@ -318,7 +318,7 @@ Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::st
 
 Resolver::Resolver(asio::io_context& ctx, std::vector<asio::ip::tcp::endpoint> endpoints, const bool ssl,
                    std::shared_ptr<dht::Logger> logger)
-    : resolver_(ctx), logger_(logger)
+    : resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger)
 {
     url_.protocol = (ssl ? "https" : "http");
     endpoints_ = std::move(endpoints);
@@ -338,6 +338,7 @@ Resolver::~Resolver()
             cb(asio::error::operation_aborted, {});
         cbs.pop();
     }
+    *destroyed_ = true;
 }
 
 void
@@ -355,10 +356,10 @@ Resolver::resolve(const std::string& host, const std::string& service)
 {
     asio::ip::tcp::resolver::query query_(host, service);
 
-    resolver_.async_resolve(query_, [this, host, service]
+    resolver_.async_resolve(query_, [this, host, service, destroyed = destroyed_]
         (const asio::error_code& ec, asio::ip::tcp::resolver::results_type endpoints)
     {
-        if (ec == asio::error::operation_aborted)
+        if (ec == asio::error::operation_aborted or *destroyed)
             return;
         if (logger_){
             if (ec)
-- 
GitLab