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