Skip to content

Commit be896b6

Browse files
committed
Add const max_collated_data_roots
1 parent fec2fd0 commit be896b6

File tree

6 files changed

+14
-8
lines changed

6 files changed

+14
-8
lines changed

crypto/vm/boc-compression.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "vm/cellslice.h"
2727
#include "td/utils/Slice-decl.h"
2828
#include "td/utils/lz4.h"
29+
#include "ton/ton-types.h"
2930

3031
namespace vm {
3132

@@ -57,7 +58,7 @@ td::Result<std::vector<td::Ref<vm::Cell>>> boc_decompress_baseline_lz4(td::Slice
5758
}
5859

5960
TRY_RESULT(decompressed, td::lz4_decompress(compressed, decompressed_size));
60-
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, 1000000, true));
61+
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, ton::max_collated_data_roots + 1, true));
6162
return roots;
6263
}
6364

ton/ton-types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ constexpr WorkchainId masterchainId = -1, basechainId = 0, workchainInvalid = 0x
5252
constexpr ShardId shardIdAll = (1ULL << 63);
5353

5454
constexpr int max_shard_pfx_len = 60;
55+
constexpr int max_collated_data_roots = 1000000;
5556

5657
enum GlobalCapabilities {
5758
capIhrEnabled = 1,

validator-session/candidate-serializer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ td::Result<td::BufferSlice> compress_candidate_data(td::Slice block, td::Slice c
7979
return td::Status::Error("block candidate should have exactly one root");
8080
}
8181
std::vector<td::Ref<vm::Cell>> roots = {boc1.get_root_cell()};
82-
TRY_STATUS(boc2.deserialize(collated_data, 1000000));
82+
TRY_STATUS(boc2.deserialize(collated_data, max_collated_data_roots));
8383
for (int i = 0; i < boc2.get_root_count(); ++i) {
8484
roots.push_back(boc2.get_root_cell(i));
8585
}
@@ -100,7 +100,7 @@ td::Result<std::pair<td::BufferSlice, td::BufferSlice>> decompress_candidate_dat
100100
if (decompressed.size() != (size_t)decompressed_size) {
101101
return td::Status::Error("decompressed size mismatch");
102102
}
103-
TRY_RESULT_ASSIGN(roots, vm::std_boc_deserialize_multi(decompressed, 1000000, true));
103+
TRY_RESULT_ASSIGN(roots, vm::std_boc_deserialize_multi(decompressed, max_collated_data_roots + 1, true));
104104
} else {
105105
TRY_RESULT_ASSIGN(roots, vm::boc_decompress(compressed, max_decompressed_size));
106106
}

validator/full-node-serializer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static td::Status deserialize_block_full(ton_api::tonNode_dataFull& f, BlockIdEx
153153
static td::Status deserialize_block_full(ton_api::tonNode_dataFullCompressed& f, BlockIdExt& id, td::BufferSlice& proof,
154154
td::BufferSlice& data, bool& is_proof_link, int max_decompressed_size) {
155155
TRY_RESULT(decompressed, td::lz4_decompress(f.compressed_, max_decompressed_size));
156-
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, 1000000, true));
156+
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, max_collated_data_roots + 1, true));
157157
if (roots.size() != 2) {
158158
return td::Status::Error("expected 2 roots in boc");
159159
}
@@ -203,7 +203,8 @@ td::Result<td::BufferSlice> serialize_block_candidate_broadcast(BlockIdExt block
203203
TRY_RESULT(root, vm::std_boc_deserialize(data));
204204
std::vector<Ref<vm::Cell>> roots = {root};
205205
if (collated_data) {
206-
TRY_RESULT(collated_data_roots, vm::std_boc_deserialize_multi(collated_data.value(), 1000000, true));
206+
TRY_RESULT(collated_data_roots,
207+
vm::std_boc_deserialize_multi(collated_data.value(), max_collated_data_roots, true));
207208
roots.insert(roots.end(), collated_data_roots.begin(), collated_data_roots.end());
208209
}
209210
TRY_RESULT(data_new, vm::std_boc_serialize_multi(std::move(roots), 2));
@@ -227,7 +228,7 @@ static td::Status deserialize_block_candidate_broadcast(ton_api::tonNode_blockCa
227228
cc_seqno = obj.catchain_seqno_;
228229
validator_set_hash = obj.validator_set_hash_;
229230
TRY_RESULT(decompressed, td::lz4_decompress(obj.compressed_, max_decompressed_data_size));
230-
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, 1000000, true));
231+
TRY_RESULT(roots, vm::std_boc_deserialize_multi(decompressed, max_collated_data_roots + 1, true));
231232
if (roots.empty()) {
232233
return td::Status::Error("expected at least 1 root in boc");
233234
}

validator/impl/collated-data-merger.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void CollatedDataMerger::add_block_candidate_data(BlockIdExt block_id, td::Buffe
134134
LOG(WARNING) << "Failed to deserialize block data for " << block_id.to_str() << " : " << r_root.error();
135135
return;
136136
}
137-
auto r_collated_roots = vm::std_boc_deserialize_multi(collated_data, 1000000, true);
137+
auto r_collated_roots = vm::std_boc_deserialize_multi(collated_data, max_collated_data_roots, true);
138138
if (r_collated_roots.is_error()) {
139139
LOG(WARNING) << "Failed to deserialize collated data for " << block_id.to_str() << " : "
140140
<< r_collated_roots.error();
@@ -165,7 +165,7 @@ td::Status CollatedDataDeduplicator::add_block_candidate(BlockSeqno seqno, td::S
165165
td::Slice collated_data) {
166166
td::Timer timer;
167167
TRY_RESULT(root, vm::std_boc_deserialize(block_data));
168-
TRY_RESULT(collated_roots, vm::std_boc_deserialize_multi(collated_data, 1000000, true));
168+
TRY_RESULT(collated_roots, vm::std_boc_deserialize_multi(collated_data, max_collated_data_roots, true));
169169
std::lock_guard lock{mutex_};
170170
td::HashSet<vm::CellHash> visited;
171171
std::function<void(const Ref<vm::Cell> &)> dfs = [&](const Ref<vm::Cell> &cell) {

validator/impl/collator.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6433,6 +6433,9 @@ bool Collator::create_collated_data() {
64336433
}
64346434

64356435
// 8. serialize collated data
6436+
if (collated_roots_.size() > max_collated_data_roots) {
6437+
return fatal_error(PSTRING() << "too many collated data roots: " << collated_roots_.size());
6438+
}
64366439
if (collated_roots_.empty()) {
64376440
collated_data_ = td::BufferSlice{0};
64386441
} else {

0 commit comments

Comments
 (0)