From cea15d975aace7e8337b9e216af23e5efa46fd49 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 29 Aug 2019 02:17:52 +0300 Subject: [PATCH] Use send_closure_later in on_user_online_timeout_callback to avoid accidental access to MultiTimoeut. GitOrigin-RevId: b488a006dcbe17d661e18a6e578c08cd070b84ea --- td/telegram/ContactsManager.cpp | 19 +++++++++++++------ td/telegram/ContactsManager.h | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 062d03a2..ddbfb072 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -2353,16 +2353,23 @@ void ContactsManager::on_user_online_timeout_callback(void *contacts_manager_ptr } auto contacts_manager = static_cast(contacts_manager_ptr); - UserId user_id(narrow_cast(user_id_long)); - auto u = contacts_manager->get_user(user_id); + send_closure_later(contacts_manager->actor_id(contacts_manager), &ContactsManager::on_user_online_timeout, + UserId(narrow_cast(user_id_long))); +} + +void ContactsManager::on_user_online_timeout(UserId user_id) { + if (G()->close_flag()) { + return; + } + + auto u = get_user(user_id); CHECK(u != nullptr); LOG(INFO) << "Update " << user_id << " online status to offline"; - send_closure_later( - G()->td(), &Td::send_update, - make_tl_object(user_id.get(), contacts_manager->get_user_status_object(user_id, u))); + send_closure(G()->td(), &Td::send_update, + td_api::make_object(user_id.get(), get_user_status_object(user_id, u))); - contacts_manager->update_user_online_member_count(u); + update_user_online_member_count(u); } void ContactsManager::on_channel_unban_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long) { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index ea13bf81..7cbea953 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -1104,6 +1104,8 @@ class ContactsManager : public Actor { static void on_channel_unban_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long); + void on_user_online_timeout(UserId user_id); + template static void store_link_state(const LinkState &link_state, StorerT &storer);