Fix crash in stale authorization keys destruction.

This commit is contained in:
John Preston 2021-08-31 14:06:03 +03:00
parent 92b7afc5f5
commit b106438de8
1 changed files with 12 additions and 5 deletions

View File

@ -71,6 +71,7 @@ public:
void setGoodProxyDomain(const QString &host, const QString &ip); void setGoodProxyDomain(const QString &host, const QString &ip);
void suggestMainDcId(DcId mainDcId); void suggestMainDcId(DcId mainDcId);
void setMainDcId(DcId mainDcId); void setMainDcId(DcId mainDcId);
[[nodiscard]] bool hasMainDcId() const;
[[nodiscard]] DcId mainDcId() const; [[nodiscard]] DcId mainDcId() const;
[[nodiscard]] rpl::producer<DcId> mainDcIdValue() const; [[nodiscard]] rpl::producer<DcId> mainDcIdValue() const;
@ -357,13 +358,13 @@ void Instance::Private::start() {
for (const auto &[shiftedDcId, dc] : _dcenters) { for (const auto &[shiftedDcId, dc] : _dcenters) {
startSession(shiftedDcId); startSession(shiftedDcId);
} }
} else if (mainDcId() != Fields::kNoneMainDc) { } else if (hasMainDcId()) {
_mainSession = startSession(mainDcId()); _mainSession = startSession(mainDcId());
} }
_checkDelayedTimer.setCallback([this] { checkDelayedRequests(); }); _checkDelayedTimer.setCallback([this] { checkDelayedRequests(); });
Assert((mainDcId() == Fields::kNoneMainDc) == isKeysDestroyer()); Assert(!hasMainDcId() == isKeysDestroyer());
requestConfig(); requestConfig();
} }
@ -474,8 +475,12 @@ void Instance::Private::setMainDcId(DcId mainDcId) {
_writeKeysRequests.fire({}); _writeKeysRequests.fire({});
} }
bool Instance::Private::hasMainDcId() const {
return (_mainDcId.current() != Fields::kNoneMainDc);
}
DcId Instance::Private::mainDcId() const { DcId Instance::Private::mainDcId() const {
Expects(_mainDcId.current() != Fields::kNoneMainDc); Expects(hasMainDcId());
return _mainDcId.current(); return _mainDcId.current();
} }
@ -557,7 +562,7 @@ void Instance::Private::requestConfigIfExpired() {
} }
void Instance::Private::requestCDNConfig() { void Instance::Private::requestCDNConfig() {
if (_cdnConfigLoadRequestId || mainDcId() == Fields::kNoneMainDc) { if (_cdnConfigLoadRequestId || !hasMainDcId()) {
return; return;
} }
_cdnConfigLoadRequestId = request( _cdnConfigLoadRequestId = request(
@ -696,6 +701,8 @@ void Instance::Private::logout(Fn<void()> done) {
} }
void Instance::Private::logoutGuestDcs() { void Instance::Private::logoutGuestDcs() {
Expects(!isKeysDestroyer());
auto dcIds = std::vector<DcId>(); auto dcIds = std::vector<DcId>();
dcIds.reserve(_keysForWrite.size()); dcIds.reserve(_keysForWrite.size());
for (const auto &key : _keysForWrite) { for (const auto &key : _keysForWrite) {
@ -1463,7 +1470,7 @@ bool Instance::Private::onErrorDefault(
LOG(("MTP Error: unauthorized request without dc info, requestId %1").arg(requestId)); LOG(("MTP Error: unauthorized request without dc info, requestId %1").arg(requestId));
} }
auto newdc = BareDcId(qAbs(dcWithShift)); auto newdc = BareDcId(qAbs(dcWithShift));
if (!newdc || newdc == mainDcId()) { if (!newdc || !hasMainDcId() || newdc == mainDcId()) {
if (!badGuestDc && _globalFailHandler) { if (!badGuestDc && _globalFailHandler) {
_globalFailHandler(error, response); // auth failed in main dc _globalFailHandler(error, response); // auth failed in main dc
} }