From fe9f1e52d22bcc018cd1e7b01256c665210bc2fe Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 9 Apr 2019 01:37:20 +0300 Subject: [PATCH] Add more DcId checks. GitOrigin-RevId: ca4bfdc046e78ef7e216c8a5bda8e5ddcd88cfec --- td/telegram/Photo.cpp | 9 +++++++-- td/telegram/files/FileHashUploader.cpp | 3 +++ td/telegram/net/DcAuthManager.cpp | 7 ++++++- td/telegram/net/DcOptions.h | 11 ++++++++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/td/telegram/Photo.cpp b/td/telegram/Photo.cpp index 75e5db7c..efc8daba 100644 --- a/td/telegram/Photo.cpp +++ b/td/telegram/Photo.cpp @@ -449,9 +449,14 @@ StringBuilder &operator<<(StringBuilder &string_builder, const PhotoSize &photo_ Photo get_photo(FileManager *file_manager, tl_object_ptr &&file, tl_object_ptr &&photo, DialogId owner_dialog_id) { - CHECK(DcId::is_valid(file->dc_id_)); + DcId dc_id; + if (!DcId::is_valid(file->dc_id_)) { + dc_id = DcId::invalid(); + } else { + dc_id = DcId::internal(file->dc_id_); + } FileId file_id = file_manager->register_remote( - FullRemoteFileLocation(FileType::Encrypted, file->id_, file->access_hash_, DcId::internal(file->dc_id_), ""), + FullRemoteFileLocation(FileType::Encrypted, file->id_, file->access_hash_, dc_id, ""), FileLocationSource::FromServer, owner_dialog_id, photo->size_, 0, PSTRING() << static_cast(file->id_) << ".jpg"); file_manager->set_encryption_key(file_id, FileEncryptionKey{photo->key_.as_slice(), photo->iv_.as_slice()}); diff --git a/td/telegram/files/FileHashUploader.cpp b/td/telegram/files/FileHashUploader.cpp index a79b918b..1a24ad67 100644 --- a/td/telegram/files/FileHashUploader.cpp +++ b/td/telegram/files/FileHashUploader.cpp @@ -134,6 +134,9 @@ Status FileHashUploader::on_result_impl(NetQueryPtr net_query) { return Status::Error("Document is not found by hash"); case telegram_api::document::ID: { auto document = move_tl_object_as(res); + if (!DcId::is_valid(document->dc_id_)) { + return Status::Error("Found document has invalid DcId"); + } callback_->on_ok(FullRemoteFileLocation(FileType::Document, document->id_, document->access_hash_, DcId::internal(document->dc_id_), document->file_reference_.as_slice().str())); diff --git a/td/telegram/net/DcAuthManager.cpp b/td/telegram/net/DcAuthManager.cpp index bfaf4202..1d8d33d6 100644 --- a/td/telegram/net/DcAuthManager.cpp +++ b/td/telegram/net/DcAuthManager.cpp @@ -31,7 +31,12 @@ DcAuthManager::DcAuthManager(ActorShared<> parent) { parent_ = std::move(parent); auto s_main_dc_id = G()->td_db()->get_binlog_pmc()->get("main_dc_id"); if (!s_main_dc_id.empty()) { - main_dc_id_ = DcId::internal(to_integer(s_main_dc_id)); + auto main_dc_id = to_integer(s_main_dc_id); + if (DcId::is_valid(main_dc_id)) { + main_dc_id_ = DcId::internal(main_dc_id); + } else { + LOG(ERROR) << "Receive invalid main dc id " << main_dc_id; + } } } diff --git a/td/telegram/net/DcOptions.h b/td/telegram/net/DcOptions.h index ffb45b25..6f4971ba 100644 --- a/td/telegram/net/DcOptions.h +++ b/td/telegram/net/DcOptions.h @@ -148,10 +148,15 @@ class DcOption { void parse(ParserT &parser) { flags_ = parser.fetch_int(); auto raw_dc_id = parser.fetch_int(); - if ((flags_ & Flags::Cdn) != 0) { - dc_id_ = DcId::external(raw_dc_id); + if (!DcId::is_valid(raw_dc_id)) { + LOG(ERROR) << "Have invalid DC ID " << raw_dc_id; + dc_id_ = DcId::invalid(); } else { - dc_id_ = DcId::internal(raw_dc_id); + if ((flags_ & Flags::Cdn) != 0) { + dc_id_ = DcId::external(raw_dc_id); + } else { + dc_id_ = DcId::internal(raw_dc_id); + } } auto ip = parser.template fetch_string(); auto port = parser.fetch_int();