diff --git a/src/dht.cpp b/src/dht.cpp index 9796fbe84b0c695609e1d3022e04f1e0ff5fc488..2d791634fea92c8eb4d97e8d3aa3bee0925490b3 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -903,8 +903,6 @@ Dht::searchStep(std::shared_ptr<Search> sr) if (auto sr = ws.lock()) { onListenDone(req, answer, sr, query); searchStep(sr); - if (auto sn = sr->getNode(req.node)) - sn->listenStatus.erase(query); } }, [this,ws,last_req,query](const Request& req, bool over) mutable @@ -1502,16 +1500,19 @@ Dht::cancelListen(const InfoHash& id, size_t token) auto af_token = s->af == AF_INET ? std::get<1>(it->second) : std::get<2>(it->second); if (af_token == 0) continue; - s->listeners.erase(af_token); - if (s->listeners.empty()) { - for (auto& sn : s->nodes) { - /* also erase requests for all searchnodes. */ - for (auto& ls : sn.listenStatus) { + std::shared_ptr<Query> query; + const auto& ll = s->listeners.find(af_token); + if (ll != s->listeners.cend()) + query = ll->second.query; + for (auto& sn : s->nodes) { + if (s->listeners.empty()) { /* also erase requests for all searchnodes. */ + for (auto& ls : sn.listenStatus) network_engine.cancelRequest(ls.second); - } sn.listenStatus.clear(); - } + } else if (query) + sn.listenStatus.erase(query); } + s->listeners.erase(af_token); } }; searches_cancel_listen(searches4);