mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-02-20 23:27:23 +00:00
Reset session on receiving a really old msgId.
This commit is contained in:
parent
d199e16a6e
commit
e3b9927faa
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user