From 6fe43311cb00a5cd21d7a9ec49dd5f10049356a8 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 14 May 2024 21:00:59 +0300 Subject: [PATCH] Add protection from chat folder deletion and recreation with the same identifier while chat list is loaded. --- td/telegram/MessagesManager.cpp | 14 +++++++++----- td/telegram/MessagesManager.h | 3 +++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index eeb4e7b27..3a6cfa3a2 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -15837,7 +15837,8 @@ void MessagesManager::get_dialogs_from_list(DialogListId dialog_list_id, int32 l Promise> &&promise) { CHECK(!td_->auth_manager_->is_bot()); - if (get_dialog_list(dialog_list_id) == nullptr) { + auto *list = get_dialog_list(dialog_list_id); + if (list == nullptr) { return promise.set_error(Status::Error(400, "Chat list not found")); } @@ -15848,6 +15849,7 @@ void MessagesManager::get_dialogs_from_list(DialogListId dialog_list_id, int32 l auto task_id = ++current_get_dialogs_task_id_; auto &task = get_dialogs_tasks_[task_id]; task.dialog_list_id = dialog_list_id; + task.dialog_list_unique_id = list->unique_id_; task.retry_count = 5; task.limit = limit; task.promise = std::move(promise); @@ -15890,7 +15892,7 @@ void MessagesManager::on_get_dialogs_from_list(int64 task_id, Result &&res } auto &task = task_it->second; auto list_ptr = get_dialog_list(task.dialog_list_id); - if (result.is_ok() && list_ptr == nullptr) { + if (result.is_ok() && (list_ptr == nullptr || list_ptr->unique_id_ != task.dialog_list_unique_id)) { CHECK(!task.dialog_list_id.is_folder()); result = Status::Error(400, "Chat list not found"); } @@ -35608,11 +35610,13 @@ MessagesManager::DialogListView MessagesManager::get_dialog_lists(const Dialog * MessagesManager::DialogList &MessagesManager::add_dialog_list(DialogListId dialog_list_id) { CHECK(!td_->auth_manager_->is_bot()); - if (dialog_lists_.count(dialog_list_id) == 0) { - LOG(INFO) << "Create " << dialog_list_id; - } + bool is_new = dialog_lists_.count(dialog_list_id) == 0; auto &list = dialog_lists_[dialog_list_id]; list.dialog_list_id = dialog_list_id; + if (is_new) { + LOG(INFO) << "Create " << dialog_list_id; + list.unique_id_ = ++current_dialog_list_unique_id_; + } return list; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 543076f9c..a5e46820f 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1370,6 +1370,7 @@ class MessagesManager final : public Actor { int32 in_memory_dialog_total_count_ = 0; int32 server_dialog_total_count_ = -1; int32 secret_chat_total_count_ = -1; + int64 unique_id_ = 0; vector> load_list_queries_; @@ -3270,6 +3271,7 @@ class MessagesManager final : public Actor { int64 current_pinned_dialog_order_ = static_cast(MIN_PINNED_DIALOG_DATE) << 32; + int64 current_dialog_list_unique_id_ = 0; std::unordered_map dialog_lists_; std::unordered_map dialog_folders_; @@ -3327,6 +3329,7 @@ class MessagesManager final : public Actor { struct GetDialogsTask { DialogListId dialog_list_id; + int64 dialog_list_unique_id; int32 limit; int32 retry_count; DialogDate last_dialog_date = MIN_DIALOG_DATE;