From e3b9927faad1801baf8782855d6008ad58eab086 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Dec 2021 10:01:45 +0400 Subject: [PATCH] Reset session on receiving a really old msgId. --- .../details/mtproto_received_ids_manager.cpp | 19 ++++++++++--------- .../details/mtproto_received_ids_manager.h | 7 ++++++- .../SourceFiles/mtproto/session_private.cpp | 14 ++++++++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.cpp b/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.cpp index 28e6ad518..20bade0c4 100644 --- a/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.cpp +++ b/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.cpp @@ -9,18 +9,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace MTP::details { -bool ReceivedIdsManager::registerMsgId(mtpMsgId msgId, bool needAck) { +ReceivedIdsManager::Result ReceivedIdsManager::registerMsgId( + mtpMsgId msgId, + bool needAck) { const auto i = _idsNeedAck.find(msgId); - if (i == _idsNeedAck.end()) { - if (_idsNeedAck.size() < kIdsBufferSize || msgId > min()) { - _idsNeedAck.emplace(msgId, needAck); - return true; - } - MTP_LOG(-1, ("No need to handle - %1 < min = %2").arg(msgId).arg(min())); - } else { + if (i != _idsNeedAck.end()) { MTP_LOG(-1, ("No need to handle - %1 already is in map").arg(msgId)); + return Result::Duplicate; + } else if (_idsNeedAck.size() < kIdsBufferSize || msgId > min()) { + _idsNeedAck.emplace(msgId, needAck); + return Result::Success; } - return false; + MTP_LOG(-1, ("Reset on too old - %1 < min = %2").arg(msgId).arg(min())); + return Result::TooOld; } mtpMsgId ReceivedIdsManager::min() const { diff --git a/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.h b/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.h index 2a8d6a57a..8f7dfbb9d 100644 --- a/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.h +++ b/Telegram/SourceFiles/mtproto/details/mtproto_received_ids_manager.h @@ -21,8 +21,13 @@ public: NeedsAck, NoAckNeeded, }; + enum class Result { + Success, + Duplicate, + TooOld, + }; - bool registerMsgId(mtpMsgId msgId, bool needAck); + [[nodiscard]] Result registerMsgId(mtpMsgId msgId, bool needAck); [[nodiscard]] mtpMsgId min() const; [[nodiscard]] mtpMsgId max() const; [[nodiscard]] State lookup(mtpMsgId msgId) const; diff --git a/Telegram/SourceFiles/mtproto/session_private.cpp b/Telegram/SourceFiles/mtproto/session_private.cpp index 0bd74787a..ca46f113e 100644 --- a/Telegram/SourceFiles/mtproto/session_private.cpp +++ b/Telegram/SourceFiles/mtproto/session_private.cpp @@ -1364,13 +1364,18 @@ void SessionPrivate::handleReceived() { ).arg(getProtocolDcId() ).arg(_encryptionKey->keyId())); - if (_receivedMessageIds.registerMsgId(msgId, needAck)) { + const auto registered = _receivedMessageIds.registerMsgId( + msgId, + needAck); + if (registered == ReceivedIdsManager::Result::Success) { res = handleOneReceived(from, end, msgId, { .outerMsgId = msgId, .serverSalt = serverSalt, .serverTime = serverTime, .badTime = badTime, }); + } else if (registered == ReceivedIdsManager::Result::TooOld) { + res = HandleResult::ResetSession; } _receivedMessageIds.shrink(); @@ -1478,9 +1483,14 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived( } auto res = HandleResult::Success; // if no need to handle, then succeed - if (_receivedMessageIds.registerMsgId(inMsgId.v, needAck)) { + const auto registered = _receivedMessageIds.registerMsgId( + inMsgId.v, + needAck); + if (registered == ReceivedIdsManager::Result::Success) { res = handleOneReceived(from, otherEnd, inMsgId.v, info); info.badTime = false; + } else if (registered == ReceivedIdsManager::Result::TooOld) { + res = HandleResult::ResetSession; } if (res != HandleResult::Success) { return res;