From b90bc7be4bc86a7cd085f3bd72389bd986a4338e Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 30 Aug 2023 18:25:26 +0300 Subject: [PATCH] Remove unsafe non-const NetQuery accessors. --- td/telegram/PhoneNumberManager.cpp | 2 +- td/telegram/Td.cpp | 12 +++++++----- td/telegram/net/NetQuery.h | 13 ++----------- td/telegram/net/NetQueryDelayer.cpp | 2 +- td/telegram/net/Session.cpp | 12 ++++++------ 5 files changed, 17 insertions(+), 24 deletions(-) diff --git a/td/telegram/PhoneNumberManager.cpp b/td/telegram/PhoneNumberManager.cpp index 796b5399a..357962937 100644 --- a/td/telegram/PhoneNumberManager.cpp +++ b/td/telegram/PhoneNumberManager.cpp @@ -244,7 +244,7 @@ void PhoneNumberManager::on_result(NetQueryPtr result) { net_query_type_ = NetQueryType::None; if (result->is_error()) { if (query_id_ != 0) { - on_query_error(std::move(result->error())); + on_query_error(result->move_as_error()); } return; } diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 656bb232a..4e2027a04 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -3104,14 +3104,16 @@ void Td::on_result(NetQueryPtr query) { if (handler != nullptr) { CHECK(query->is_ready()); if (query->is_ok()) { - handler->on_result(std::move(query->ok())); + handler->on_result(query->move_as_ok()); } else { - handler->on_error(std::move(query->error())); + handler->on_error(query->move_as_error()); } - } else if (!query->is_ok() || query->ok_tl_constructor() != telegram_api::upload_file::ID) { - LOG(WARNING) << query << " is ignored: no handlers found"; + } else { + if (!query->is_ok() || query->ok_tl_constructor() != telegram_api::upload_file::ID) { + LOG(WARNING) << query << " is ignored: no handlers found"; + } + query->clear(); } - query->clear(); } void Td::on_connection_state_changed(ConnectionState new_state) { diff --git a/td/telegram/net/NetQuery.h b/td/telegram/net/NetQuery.h index 6035e7900..b10fdbd09 100644 --- a/td/telegram/net/NetQuery.h +++ b/td/telegram/net/NetQuery.h @@ -95,25 +95,15 @@ class NetQuery final : public TsListNode { resend(dc_id_); } - BufferSlice &query() { + const BufferSlice &query() const { return query_; } - BufferSlice &ok() { - CHECK(state_ == State::OK); - return answer_; - } - const BufferSlice &ok() const { CHECK(state_ == State::OK); return answer_; } - Status &error() { - CHECK(state_ == State::Error); - return status_; - } - const Status &error() const { CHECK(state_ == State::Error); return status_; @@ -124,6 +114,7 @@ class NetQuery final : public TsListNode { clear(); return ok; } + Status move_as_error() TD_WARN_UNUSED_RESULT { auto status = std::move(status_); clear(); diff --git a/td/telegram/net/NetQueryDelayer.cpp b/td/telegram/net/NetQueryDelayer.cpp index 668533a4b..8bc5fecaa 100644 --- a/td/telegram/net/NetQueryDelayer.cpp +++ b/td/telegram/net/NetQueryDelayer.cpp @@ -58,7 +58,7 @@ void NetQueryDelayer::delay(NetQueryPtr query) { query->last_timeout_ = timeout; LOG(INFO) << "Set total_timeout to " << query->total_timeout_ << " for " << query->id(); - auto error = query->error().move_as_error(); + auto error = query->error().clone(); query->resend(); // Fix for infinity flood control diff --git a/td/telegram/net/Session.cpp b/td/telegram/net/Session.cpp index 81c2fc004..57744e92b 100644 --- a/td/telegram/net/Session.cpp +++ b/td/telegram/net/Session.cpp @@ -391,7 +391,7 @@ void Session::on_bind_result(NetQueryPtr query) { Status status; if (query->is_error()) { - status = std::move(query->error()); + status = query->move_as_error(); if (status.code() == 400 && status.message() == "ENCRYPTED_MESSAGE_INVALID") { auto server_time = G()->server_time(); auto auth_key_creation_date = auth_data_.get_main_auth_key().created_at(); @@ -424,7 +424,8 @@ void Session::on_bind_result(NetQueryPtr query) { } } } else { - auto r_flag = fetch_result(query->ok()); + auto answer = query->move_as_ok(); + auto r_flag = fetch_result(answer); if (r_flag.is_error()) { status = r_flag.move_as_error(); } else if (!r_flag.ok()) { @@ -444,7 +445,6 @@ void Session::on_bind_result(NetQueryPtr query) { connection_close(&long_poll_connection_); } - query->clear(); yield(); } @@ -455,9 +455,10 @@ void Session::on_check_key_result(NetQueryPtr query) { Status status; if (query->is_error()) { - status = std::move(query->error()); + status = query->move_as_error(); } else { - auto r_flag = fetch_result(query->ok()); + auto answer = query->move_as_ok(); + auto r_flag = fetch_result(answer); if (r_flag.is_error()) { status = r_flag.move_as_error(); } @@ -472,7 +473,6 @@ void Session::on_check_key_result(NetQueryPtr query) { connection_close(&long_poll_connection_); } - query->clear(); yield(); }