Skip to content
Snippets Groups Projects
Unverified Commit 34b53ccd authored by Sébastien Blin's avatar Sébastien Blin
Browse files

namedirectory: fix double free on requests_

the map should be protected to avoid erasing requests during
the shutdown and in the callback

Change-Id: I003b868239209c7ccd4f22274cbc2c949fefba2a
GitLab: #440
parent cafc155d
No related branches found
No related tags found
No related merge requests found
...@@ -77,9 +77,7 @@ NameDirectory::instance() ...@@ -77,9 +77,7 @@ NameDirectory::instance()
} }
void void
NameDirectory::lookupUri(std::string_view uri, NameDirectory::lookupUri(std::string_view uri, const std::string& default_server, LookupCallback cb)
const std::string& default_server,
LookupCallback cb)
{ {
const std::string& default_ns = default_server.empty() ? DEFAULT_SERVER_HOST : default_server; const std::string& default_ns = default_server.empty() ? DEFAULT_SERVER_HOST : default_server;
std::svmatch pieces_match; std::svmatch pieces_match;
...@@ -108,6 +106,12 @@ NameDirectory::NameDirectory(const std::string& serverUrl, std::shared_ptr<dht:: ...@@ -108,6 +106,12 @@ NameDirectory::NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::
+ DIR_SEPARATOR_STR + resolver_->get_url().host; + DIR_SEPARATOR_STR + resolver_->get_url().host;
} }
NameDirectory::~NameDirectory()
{
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.clear();
}
void void
NameDirectory::load() NameDirectory::load()
{ {
...@@ -199,12 +203,15 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) ...@@ -199,12 +203,15 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
cb("", Response::error); cb("", Response::error);
} }
} }
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
}); });
request->send(); request->send();
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_[reqid] = request; requests_[reqid] = request;
} catch (const std::exception& e) { } catch (const std::exception& e) {
JAMI_ERR("Error when performing address lookup: %s", e.what()); JAMI_ERR("Error when performing address lookup: %s", e.what());
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
} }
} }
...@@ -296,12 +303,15 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb) ...@@ -296,12 +303,15 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb)
cb("", Response::error); cb("", Response::error);
} }
} }
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
}); });
request->send(); request->send();
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_[reqid] = request; requests_[reqid] = request;
} catch (const std::exception& e) { } catch (const std::exception& e) {
JAMI_ERR("Name lookup for %s failed: %s", name.c_str(), e.what()); JAMI_ERR("Name lookup for %s failed: %s", name.c_str(), e.what());
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
} }
} }
...@@ -399,13 +409,16 @@ NameDirectory::registerName(const std::string& addr, ...@@ -399,13 +409,16 @@ NameDirectory::registerName(const std::string& addr,
} }
cb(success ? RegistrationResponse::success : RegistrationResponse::error); cb(success ? RegistrationResponse::success : RegistrationResponse::error);
} }
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
}); });
request->send(); request->send();
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_[reqid] = request; requests_[reqid] = request;
} catch (const std::exception& e) { } catch (const std::exception& e) {
JAMI_ERR("Error when performing name registration: %s", e.what()); JAMI_ERR("Error when performing name registration: %s", e.what());
cb(RegistrationResponse::error); cb(RegistrationResponse::error);
std::lock_guard<std::mutex> lk(requestsMtx_);
requests_.erase(reqid); requests_.erase(reqid);
} }
} }
......
...@@ -67,6 +67,7 @@ public: ...@@ -67,6 +67,7 @@ public:
using RegistrationCallback = std::function<void(RegistrationResponse response)>; using RegistrationCallback = std::function<void(RegistrationResponse response)>;
NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {}); NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {});
~NameDirectory();
void load(); void load();
static NameDirectory& instance(const std::string& serverUrl, static NameDirectory& instance(const std::string& serverUrl,
...@@ -108,6 +109,7 @@ private: ...@@ -108,6 +109,7 @@ private:
*/ */
std::shared_ptr<asio::io_context> httpContext_; std::shared_ptr<asio::io_context> httpContext_;
std::shared_ptr<dht::http::Resolver> resolver_; std::shared_ptr<dht::http::Resolver> resolver_;
std::mutex requestsMtx_ {};
std::map<unsigned, std::shared_ptr<dht::http::Request>> requests_; std::map<unsigned, std::shared_ptr<dht::http::Request>> requests_;
std::map<std::string, std::string> nameCache_ {}; std::map<std::string, std::string> nameCache_ {};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment