From 597c0d2983e39bb754553c254389a2bc2cd95384 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 12 Nov 2020 01:19:30 +0300 Subject: [PATCH] Add checks that client ID doesn't overflow. --- td/telegram/Client.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp index 1e7658dc1..9cc4cf9a9 100644 --- a/td/telegram/Client.cpp +++ b/td/telegram/Client.cpp @@ -86,6 +86,7 @@ class ClientManager::Impl final { concurrent_scheduler_->init(0); concurrent_scheduler_->start(); } + CHECK(client_id_ != std::numeric_limits::max()); auto client_id = ++client_id_; tds_[client_id] = concurrent_scheduler_->create_actor_unsafe(0, "Td", receiver_.create_callback(client_id), options_); @@ -362,7 +363,7 @@ class MultiImpl { } static bool is_valid_client_id(int32 client_id) { - return client_id > 0 && client_id < current_id_.load(); + return client_id > 0 && static_cast(client_id) < current_id_.load(); } void send(ClientManager::ClientId client_id, ClientManager::RequestId request_id, @@ -393,10 +394,12 @@ class MultiImpl { thread scheduler_thread_; ActorOwn multi_td_; - static std::atomic current_id_; + static std::atomic current_id_; static int32 create_id() { - return current_id_.fetch_add(1); + auto result = current_id_.fetch_add(1); + CHECK(result <= static_cast(std::numeric_limits::max())); + return static_cast(result); } void create(int32 td_id, unique_ptr callback) { @@ -405,7 +408,7 @@ class MultiImpl { } }; -std::atomic MultiImpl::current_id_{1}; +std::atomic MultiImpl::current_id_{1}; class MultiImplPool { public: