Reset session on receiving a really old msgId.

This commit is contained in:
John Preston 2021-12-07 10:01:45 +04:00
parent d199e16a6e
commit e3b9927faa
3 changed files with 28 additions and 12 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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;