Skip to content
Snippets Groups Projects
Commit 63afc8c2 authored by Seva's avatar Seva Committed by Adrien Béraud
Browse files

http: fix resolver destruction race condition

parent 6a760a62
No related branches found
No related tags found
No related merge requests found
...@@ -171,6 +171,7 @@ private: ...@@ -171,6 +171,7 @@ private:
Url url_; Url url_;
asio::error_code ec_; asio::error_code ec_;
asio::ip::tcp::resolver resolver_; asio::ip::tcp::resolver resolver_;
std::shared_ptr<bool> destroyed_;
std::vector<asio::ip::tcp::endpoint> endpoints_; std::vector<asio::ip::tcp::endpoint> endpoints_;
bool completed_ {false}; bool completed_ {false};
......
...@@ -301,14 +301,14 @@ Connection::timeout(const std::chrono::seconds timeout, HandlerCb cb) ...@@ -301,14 +301,14 @@ Connection::timeout(const std::chrono::seconds timeout, HandlerCb cb)
// Resolver // Resolver
Resolver::Resolver(asio::io_context& ctx, const std::string& url, std::shared_ptr<dht::Logger> logger) 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); resolve(url_.host, url_.service);
} }
Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service, Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service,
const bool ssl, std::shared_ptr<dht::Logger> logger) 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_.host = host;
url_.service = service; url_.service = service;
...@@ -318,7 +318,7 @@ Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::st ...@@ -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, Resolver::Resolver(asio::io_context& ctx, std::vector<asio::ip::tcp::endpoint> endpoints, const bool ssl,
std::shared_ptr<dht::Logger> logger) 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"); url_.protocol = (ssl ? "https" : "http");
endpoints_ = std::move(endpoints); endpoints_ = std::move(endpoints);
...@@ -338,6 +338,7 @@ Resolver::~Resolver() ...@@ -338,6 +338,7 @@ Resolver::~Resolver()
cb(asio::error::operation_aborted, {}); cb(asio::error::operation_aborted, {});
cbs.pop(); cbs.pop();
} }
*destroyed_ = true;
} }
void void
...@@ -355,10 +356,10 @@ Resolver::resolve(const std::string& host, const std::string& service) ...@@ -355,10 +356,10 @@ Resolver::resolve(const std::string& host, const std::string& service)
{ {
asio::ip::tcp::resolver::query query_(host, 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) (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; return;
if (logger_){ if (logger_){
if (ec) if (ec)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment