fix: crashes & infinite loop

This commit is contained in:
ZavaruKitsu 2024-02-09 20:00:14 +03:00
parent 222a643ce3
commit 5bb633d982
4 changed files with 37 additions and 16 deletions

View file

@ -34,7 +34,7 @@ void lateInit() {
}
void runOnce() {
if (!Core::App().domain().started()) {
if (!Core::IsAppLaunched() || !Core::App().domain().started()) {
return;
}

View file

@ -182,9 +182,13 @@ void initialize() {
}
void addEditedMessage(const EditedMessage &message) {
storage.begin_transaction();
storage.insert(message);
storage.commit();
try {
storage.begin_transaction();
storage.insert(message);
storage.commit();
} catch (std::exception& ex) {
LOG(("Failed to save edited message for some reason: %1").arg(ex.what()));
}
}
std::vector<EditedMessage> getEditedMessages(ID userId, ID dialogId, ID messageId) {
@ -198,13 +202,18 @@ std::vector<EditedMessage> getEditedMessages(ID userId, ID dialogId, ID messageI
}
bool hasRevisions(ID userId, ID dialogId, ID messageId) {
return storage.count<EditedMessage>(
where(
c(&EditedMessage::userId) == userId and
c(&EditedMessage::dialogId) == dialogId and
c(&EditedMessage::messageId) == messageId
)
) > 0;
try {
return storage.count<EditedMessage>(
where(
c(&EditedMessage::userId) == userId and
c(&EditedMessage::dialogId) == dialogId and
c(&EditedMessage::messageId) == messageId
)
) > 0;
} catch (std::exception& ex) {
LOG(("Failed to check if message has revisions: %1").arg(ex.what()));
return false;
}
}
}

View file

@ -2468,11 +2468,21 @@ void Session::checkTTLs() {
_ttlCheckTimer.cancel();
const auto now = base::unixtime::now();
while (!_ttlMessages.empty() && _ttlMessages.begin()->first <= now) {
if (!settings->saveDeletedMessages) {
if (settings->saveDeletedMessages) {
auto toBeRemoved = ranges::views::take_while(
_ttlMessages,
[now](const auto &pair) {
return pair.first <= now;
}) | ranges::views::transform([](const auto &pair) {
return pair.second;
}) | ranges::views::join;
for (auto &item : toBeRemoved) {
item->setAyuHint(settings->deletedMark);
}
} else {
while (!_ttlMessages.empty() && _ttlMessages.begin()->first <= now) {
_ttlMessages.begin()->second.front()->destroy();
} else {
_ttlMessages.begin()->second.front()->setAyuHint(settings->deletedMark);
}
}
scheduleNextTTLs();

View file

@ -3264,7 +3264,9 @@ void HistoryWidget::messagesReceived(
not_null<PeerData*> peer,
const MTPmessages_Messages &messages,
int requestId) {
Expects(_history != nullptr);
if (!_history) {
return; // AyuGram: fix crash when using `saveDeletedMessages`
}
const auto toMigrated = (peer == _peer->migrateFrom());
if (peer != _peer && !toMigrated) {