From caa1db85abacbe58ef1110f1b698d47ebdb18563 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 7 Mar 2021 02:21:08 +0300 Subject: [PATCH] Prevent race in updating of joined voice chat. --- td/telegram/GroupCallManager.cpp | 8 ++++++++ td/telegram/GroupCallManager.h | 2 ++ td/telegram/MessagesManager.cpp | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/td/telegram/GroupCallManager.cpp b/td/telegram/GroupCallManager.cpp index 9f32d5fe8..ddb439665 100644 --- a/td/telegram/GroupCallManager.cpp +++ b/td/telegram/GroupCallManager.cpp @@ -677,6 +677,14 @@ bool GroupCallManager::is_group_call_being_joined(InputGroupCallId input_group_c return pending_join_requests_.count(input_group_call_id) != 0; } +bool GroupCallManager::is_group_call_joined(InputGroupCallId input_group_call_id) const { + auto group_call = get_group_call(input_group_call_id); + if (group_call == nullptr) { + return false; + } + return group_call->is_joined && !group_call->is_being_left; +} + GroupCallId GroupCallManager::get_group_call_id(InputGroupCallId input_group_call_id, DialogId dialog_id) { if (td_->auth_manager_->is_bot() || !input_group_call_id.is_valid()) { return GroupCallId(); diff --git a/td/telegram/GroupCallManager.h b/td/telegram/GroupCallManager.h index 2e7afefee..7f04205e9 100644 --- a/td/telegram/GroupCallManager.h +++ b/td/telegram/GroupCallManager.h @@ -41,6 +41,8 @@ class GroupCallManager : public Actor { bool is_group_call_being_joined(InputGroupCallId input_group_call_id) const; + bool is_group_call_joined(InputGroupCallId input_group_call_id) const; + GroupCallId get_group_call_id(InputGroupCallId input_group_call_id, DialogId dialog_id); void create_voice_chat(DialogId dialog_id, Promise &&promise); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 300e2f1b6..52a31bf36 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -29722,11 +29722,18 @@ void MessagesManager::on_update_dialog_group_call(DialogId dialog_id, bool has_a if (!has_active_group_call) { is_group_call_empty = false; } + if (d->active_group_call_id.is_valid() && has_active_group_call && is_group_call_empty && + (td_->group_call_manager_->is_group_call_being_joined(d->active_group_call_id) || + td_->group_call_manager_->is_group_call_joined(d->active_group_call_id))) { + LOG(INFO) << "Fix is_group_call_empty to false"; + is_group_call_empty = false; + } if (d->has_active_group_call == has_active_group_call && d->is_group_call_empty == is_group_call_empty) { return; } if (!force && d->active_group_call_id.is_valid() && td_->group_call_manager_->is_group_call_being_joined(d->active_group_call_id)) { + LOG(INFO) << "Ignore update in a being joined group call"; return; }