diff --git a/Telegram/SourceFiles/mtproto/special_config_request.cpp b/Telegram/SourceFiles/mtproto/special_config_request.cpp index d8093ec3b..8b57956b7 100644 --- a/Telegram/SourceFiles/mtproto/special_config_request.cpp +++ b/Telegram/SourceFiles/mtproto/special_config_request.cpp @@ -453,7 +453,7 @@ void DomainResolver::resolve(const AttemptKey &key) { auto hosts = DnsDomains(); std::random_device rd; ranges::shuffle(hosts, std::mt19937(rd())); - _attempts.emplace(key, std::move(hosts)); + _attempts.emplace(key, Attempts{ std::move(hosts) }); sendNextRequest(key); } @@ -478,12 +478,13 @@ void DomainResolver::sendNextRequest(const AttemptKey &key) { if (i == end(_attempts)) { return; } - auto &hosts = i->second; + auto &attempts = i->second; + auto &hosts = attempts.hosts; const auto host = hosts.back(); hosts.pop_back(); if (!hosts.empty()) { - App::CallDelayed(kSendNextTimeout, this, [=] { + App::CallDelayed(kSendNextTimeout, &attempts.guard, [=] { sendNextRequest(key); }); } diff --git a/Telegram/SourceFiles/mtproto/special_config_request.h b/Telegram/SourceFiles/mtproto/special_config_request.h index cba2e71b0..be12d759f 100644 --- a/Telegram/SourceFiles/mtproto/special_config_request.h +++ b/Telegram/SourceFiles/mtproto/special_config_request.h @@ -91,6 +91,11 @@ private: QStringList ips; crl::time expireAt = 0; + }; + struct Attempts { + std::vector<QString> hosts; + base::has_weak_ptr guard; + }; void resolve(const AttemptKey &key); @@ -110,7 +115,7 @@ private: crl::time expireAt)> _callback; QNetworkAccessManager _manager; - std::map<AttemptKey, std::vector<QString>> _attempts; + std::map<AttemptKey, Attempts> _attempts; std::map<AttemptKey, std::vector<ServiceWebRequest>> _requests; std::map<AttemptKey, CacheEntry> _cache; crl::time _lastTimestamp = 0;