From eacce16486fe7b3e58b39ff01dafd6aa42925ced Mon Sep 17 00:00:00 2001 From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> Date: Fri, 26 Feb 2021 09:49:18 -0500 Subject: [PATCH] namedirectory: prevent deadlock on destruction The default status code of 0 is passed to the done callbacks when the requests are destroyed. Returning from the callback when we get this code prevents locking the mutex on multiple times on the same thread. Change-Id: I4e6da6de7b6572d6a0f744c3b90d1be28ad0298c --- src/jamidht/namedirectory.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp index 7edc9d1855..4b16bff514 100644 --- a/src/jamidht/namedirectory.cpp +++ b/src/jamidht/namedirectory.cpp @@ -162,6 +162,9 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) setHeaderFields(*request); request->add_on_done_callback( [this, cb = std::move(cb), reqid, addr](const dht::http::Response& response) { + if (response.status_code == 0) { + return; + } if (response.status_code >= 400 && response.status_code < 500) { cb("", Response::notFound); } else if (response.status_code != 200) { @@ -248,6 +251,9 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb) setHeaderFields(*request); request->add_on_done_callback([this, reqid, name, cb = std::move(cb)]( const dht::http::Response& response) { + if (response.status_code == 0) { + return; + } if (response.status_code >= 400 && response.status_code < 500) cb("", Response::notFound); else if (response.status_code < 200 || response.status_code > 299) -- GitLab