1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-12 11:12:16 +00:00

Check fec type in incoming messages in RLDP

This commit is contained in:
SpyCheese 2022-10-03 09:14:50 +03:00
parent b96ab80dfd
commit e05af05635
3 changed files with 36 additions and 18 deletions

View file

@ -19,6 +19,7 @@
#include "fec.h"
#include "td/utils/overloaded.h"
#include "auto/tl/ton_api.hpp"
#include "td/utils/misc.h"
namespace ton {
@ -98,24 +99,37 @@ td::uint32 FecType::symbol_size() const {
}
td::Result<FecType> FecType::create(tl_object_ptr<ton_api::fec_Type> obj) {
td::int32 data_size_int, symbol_size_int, symbols_count_int;
ton_api::downcast_call(*obj, td::overloaded([&](const auto &obj) {
data_size_int = obj.data_size_;
symbol_size_int = obj.symbol_size_;
symbols_count_int = obj.symbols_count_;
}));
TRY_RESULT(data_size, td::narrow_cast_safe<size_t>(data_size_int));
TRY_RESULT(symbol_size, td::narrow_cast_safe<size_t>(symbol_size_int));
TRY_RESULT(symbols_count, td::narrow_cast_safe<size_t>(symbols_count_int));
if (symbol_size == 0) {
return td::Status::Error("invalid fec type: symbol_size is 0");
}
if (symbol_size > 1 << 11) {
return td::Status::Error("invalid fec type: symbol_size is too big");
}
if (symbols_count != (data_size + symbol_size - 1) / symbol_size) {
return td::Status::Error("invalid fec type: wrong symbols_count");
}
FecType T;
ton_api::downcast_call(
*obj.get(), td::overloaded(
[&](const ton_api::fec_raptorQ &obj) {
T.type_ = td::fec::RaptorQEncoder::Parameters{static_cast<size_t>(obj.data_size_),
static_cast<size_t>(obj.symbol_size_),
static_cast<size_t>(obj.symbols_count_)};
},
[&](const ton_api::fec_roundRobin &obj) {
T.type_ = td::fec::RoundRobinEncoder::Parameters{static_cast<size_t>(obj.data_size_),
static_cast<size_t>(obj.symbol_size_),
static_cast<size_t>(obj.symbols_count_)};
},
[&](const ton_api::fec_online &obj) {
T.type_ = td::fec::OnlineEncoder::Parameters{static_cast<size_t>(obj.data_size_),
static_cast<size_t>(obj.symbol_size_),
static_cast<size_t>(obj.symbols_count_)};
}));
ton_api::downcast_call(*obj,
td::overloaded(
[&](const ton_api::fec_raptorQ &obj) {
T.type_ = td::fec::RaptorQEncoder::Parameters{data_size, symbol_size, symbols_count};
},
[&](const ton_api::fec_roundRobin &obj) {
T.type_ = td::fec::RoundRobinEncoder::Parameters{data_size, symbol_size, symbols_count};
},
[&](const ton_api::fec_online &obj) {
T.type_ = td::fec::OnlineEncoder::Parameters{data_size, symbol_size, symbols_count};
}));
return T;
}

View file

@ -28,8 +28,8 @@ td::Result<std::unique_ptr<BroadcastFec>> BroadcastFec::create(Overlay::Broadcas
Overlay::BroadcastDataHash data_hash, td::uint32 flags,
td::uint32 date, fec::FecType fec_type) {
auto F = std::make_unique<BroadcastFec>(hash, std::move(src), data_hash, flags, date, std::move(fec_type));
TRY_STATUS(F->init_fec_type());
TRY_STATUS(F->run_checks());
TRY_STATUS(F->init_fec_type());
return std::move(F);
}

View file

@ -125,6 +125,10 @@ void RldpTransferReceiverImpl::receive_part(fec::FecType fec_type, td::uint32 pa
}
if (!decoder_) {
if (offset_ + fec_type.size() > total_size_) {
VLOG(RLDP_NOTICE) << "failed to create decoder: data size in fec type is too big";
return;
}
auto D = fec_type.create_decoder();
if (D.is_error()) {
VLOG(RLDP_WARNING) << "failed to create decoder: " << D.move_as_error();