Add protection from chat folder deletion and recreation with the same identifier while chat list is loaded.

This commit is contained in:
levlam 2024-05-14 21:00:59 +03:00
parent 1601b703de
commit 6fe43311cb
2 changed files with 12 additions and 5 deletions

View File

@ -15837,7 +15837,8 @@ void MessagesManager::get_dialogs_from_list(DialogListId dialog_list_id, int32 l
Promise<td_api::object_ptr<td_api::chats>> &&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<Unit> &&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;
}

View File

@ -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<Promise<Unit>> load_list_queries_;
@ -3270,6 +3271,7 @@ class MessagesManager final : public Actor {
int64 current_pinned_dialog_order_ = static_cast<int64>(MIN_PINNED_DIALOG_DATE) << 32;
int64 current_dialog_list_unique_id_ = 0;
std::unordered_map<DialogListId, DialogList, DialogListIdHash> dialog_lists_;
std::unordered_map<FolderId, DialogFolder, FolderIdHash> 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;