@@ -310,8 +310,7 @@ std::variant<EOF1Header, EOFValidationError> validate_header(
310
310
}
311
311
312
312
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,
315
314
std::queue<uint16_t >& code_sections_worklist) noexcept
316
315
{
317
316
const bytes_view code{header.get_code (container, code_idx)};
@@ -378,9 +377,7 @@ EOFValidationError validate_instructions(evmc_revision rev, const EOF1Header& he
378
377
if (container_idx >= header.container_sizes .size ())
379
378
return EOFValidationError::invalid_container_section_index;
380
379
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])
384
381
return EOFValidationError::eofcreate_with_truncated_container;
385
382
386
383
++i;
@@ -646,8 +643,7 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
646
643
{
647
644
// Validate subcontainer headers and get their data sections
648
645
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;
651
647
for (size_t subcont_idx = 0 ; subcont_idx < header.container_sizes .size (); ++subcont_idx)
652
648
{
653
649
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
659
655
660
656
auto & subcont_header = std::get<EOF1Header>(error_subcont_or_header);
661
657
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]) );
664
660
665
661
container_queue.emplace (subcontainer, std::move (subcont_header));
666
662
}
@@ -680,8 +676,8 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
680
676
visited_code_sections[code_idx] = true ;
681
677
682
678
// 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);
685
681
686
682
if (error_instr != EOFValidationError::success)
687
683
return error_instr;
0 commit comments