Skip to content

Commit 88ef87e

Browse files
committed
Use can_init in EOFCREATE
1 parent af17b74 commit 88ef87e

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

lib/evmone/eof.cpp

+7-11
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,7 @@ std::variant<EOF1Header, EOFValidationError> validate_header(
310310
}
311311

312312
EOFValidationError validate_instructions(evmc_revision rev, const EOF1Header& header,
313-
std::span<const uint16_t> subcontainer_data_offsets,
314-
std::span<const uint16_t> subcontainer_data_sizes, size_t code_idx, bytes_view container,
313+
std::vector<bool> subcontainer_can_init, size_t code_idx, bytes_view container,
315314
std::queue<uint16_t>& code_sections_worklist) noexcept
316315
{
317316
const bytes_view code{header.get_code(container, code_idx)};
@@ -378,9 +377,7 @@ EOFValidationError validate_instructions(evmc_revision rev, const EOF1Header& he
378377
if (container_idx >= header.container_sizes.size())
379378
return EOFValidationError::invalid_container_section_index;
380379

381-
const auto subcontainer_end =
382-
subcontainer_data_offsets[container_idx] + subcontainer_data_sizes[container_idx];
383-
if (op == OP_EOFCREATE && subcontainer_end != header.container_sizes[container_idx])
380+
if (op == OP_EOFCREATE && !subcontainer_can_init[container_idx])
384381
return EOFValidationError::eofcreate_with_truncated_container;
385382

386383
++i;
@@ -646,8 +643,7 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
646643
{
647644
// Validate subcontainer headers and get their data sections
648645
const auto& [container, header] = container_queue.front();
649-
std::vector<uint16_t> subcontainer_data_offsets;
650-
std::vector<uint16_t> subcontainer_data_sizes;
646+
std::vector<bool> subcontainer_can_init;
651647
for (size_t subcont_idx = 0; subcont_idx < header.container_sizes.size(); ++subcont_idx)
652648
{
653649
const bytes_view subcontainer{header.get_container(container, subcont_idx)};
@@ -659,8 +655,8 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
659655

660656
auto& subcont_header = std::get<EOF1Header>(error_subcont_or_header);
661657

662-
subcontainer_data_offsets.push_back(subcont_header.data_offset);
663-
subcontainer_data_sizes.push_back(subcont_header.data_size);
658+
subcontainer_can_init.push_back(
659+
subcont_header.can_init(header.container_sizes[subcont_idx]));
664660

665661
container_queue.emplace(subcontainer, std::move(subcont_header));
666662
}
@@ -680,8 +676,8 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
680676
visited_code_sections[code_idx] = true;
681677

682678
// Validate instructions
683-
const auto error_instr = validate_instructions(rev, header, subcontainer_data_offsets,
684-
subcontainer_data_sizes, code_idx, container, code_sections_queue);
679+
const auto error_instr = validate_instructions(
680+
rev, header, subcontainer_can_init, code_idx, container, code_sections_queue);
685681

686682
if (error_instr != EOFValidationError::success)
687683
return error_instr;

0 commit comments

Comments
 (0)