diff --git a/td/telegram/DeviceTokenManager.cpp b/td/telegram/DeviceTokenManager.cpp index 56ad973e..f18ba689 100644 --- a/td/telegram/DeviceTokenManager.cpp +++ b/td/telegram/DeviceTokenManager.cpp @@ -69,7 +69,7 @@ void DeviceTokenManager::TokenInfo::parse(ParserT &parser) { PARSE_FLAG(is_register); PARSE_FLAG(is_app_sandbox); PARSE_FLAG(encrypt); - END_PARSE_FLAGS_GENERIC(); + END_PARSE_FLAGS(); CHECK(is_sync + is_unregister + is_register == 1); if (is_sync) { state = State::Sync; diff --git a/td/telegram/SecretChatActor.h b/td/telegram/SecretChatActor.h index abf471cd..614e0a84 100644 --- a/td/telegram/SecretChatActor.h +++ b/td/telegram/SecretChatActor.h @@ -209,7 +209,7 @@ class SecretChatActor : public NetQueryCallback { my_layer = parser.fetch_int(); // for future usage BEGIN_PARSE_FLAGS(); - END_PARSE_FLAGS_GENERIC(); + END_PARSE_FLAGS(); } } diff --git a/td/telegram/files/FileData.hpp b/td/telegram/files/FileData.hpp index f2ff55be..51fe8dd9 100644 --- a/td/telegram/files/FileData.hpp +++ b/td/telegram/files/FileData.hpp @@ -66,6 +66,7 @@ void FileData::store(StorerT &storer) const { } } } + template void FileData::parse(ParserT &parser, bool register_file_sources) { using ::td::parse; @@ -80,7 +81,10 @@ void FileData::parse(ParserT &parser, bool register_file_sources) { PARSE_FLAG(encryption_key_is_secure); PARSE_FLAG(has_sources); PARSE_FLAG(has_version); - TRY_END_PARSE_FLAGS_GENERIC(); + END_PARSE_FLAGS(); + if (parser.get_error()) { + return; + } int32 version = 0; if (has_version) { @@ -115,6 +119,9 @@ void FileData::parse(ParserT &parser, bool register_file_sources) { parse(size, parser); if (0 < size && size < 5) { for (int i = 0; i < size; i++) { + if (parser.get_error()) { + return; + } file_source_ids_.push_back(td->file_reference_manager_->parse_file_source(td, parser)); } } else { diff --git a/tddb/td/db/binlog/Binlog.cpp b/tddb/td/db/binlog/Binlog.cpp index 29904acd..be4f3803 100644 --- a/tddb/td/db/binlog/Binlog.cpp +++ b/tddb/td/db/binlog/Binlog.cpp @@ -83,7 +83,7 @@ struct AesCtrEncryptionEvent { void parse(ParserT &&parser) { using td::parse; BEGIN_PARSE_FLAGS(); - END_PARSE_FLAGS_GENERIC(); + END_PARSE_FLAGS(); parse(key_salt_, parser); parse(iv_, parser); parse(key_hash_, parser); diff --git a/tdutils/td/utils/Parser.h b/tdutils/td/utils/Parser.h index 6ac1b7ae..5d10849b 100644 --- a/tdutils/td/utils/Parser.h +++ b/tdutils/td/utils/Parser.h @@ -185,4 +185,5 @@ class Parser { char *end_; Status status_; }; + } // namespace td diff --git a/tdutils/td/utils/tl_helpers.h b/tdutils/td/utils/tl_helpers.h index 33a5905c..3fed1512 100644 --- a/tdutils/td/utils/tl_helpers.h +++ b/tdutils/td/utils/tl_helpers.h @@ -44,26 +44,12 @@ flag = ((flags_parse >> bit_offset_parse) & 1) != 0; \ bit_offset_parse++ -#define END_PARSE_FLAGS() \ - CHECK(bit_offset_parse < 31); \ - LOG_CHECK((flags_parse & ~((1 << bit_offset_parse) - 1)) == 0) \ - << flags_parse << " " << bit_offset_parse << " " << parser.version(); \ - } \ - while (false) - -#define END_PARSE_FLAGS_GENERIC() \ - CHECK(bit_offset_parse < 31); \ - LOG_CHECK((flags_parse & ~((1 << bit_offset_parse) - 1)) == 0) << flags_parse << " " << bit_offset_parse; \ - } \ - while (false) - -#define TRY_END_PARSE_FLAGS_GENERIC() \ - CHECK(bit_offset_parse < 31); \ - if ((flags_parse & ~((1 << bit_offset_parse) - 1)) != 0) { \ - parser.set_error("invalid flags"); \ - return; \ - } \ - } \ +#define END_PARSE_FLAGS() \ + CHECK(bit_offset_parse < 31); \ + if ((flags_parse & ~((1 << bit_offset_parse) - 1)) != 0) { \ + parser.set_error(PSTRING() << "Invalid flags " << flags_parse << " left, current bit is " << bit_offset_parse); \ + } \ + } \ while (false) namespace td {