@@ -321,10 +321,7 @@ struct InstructionValidationResult
321
321
};
322
322
323
323
std::variant<InstructionValidationResult, EOFValidationError> validate_instructions (
324
- evmc_revision rev, const EOF1Header& header,
325
- std::span<const uint16_t > subcontainer_data_offsets,
326
- std::span<const uint16_t > subcontainer_data_sizes, size_t code_idx,
327
- bytes_view container) noexcept
324
+ evmc_revision rev, const EOF1Header& header, size_t code_idx, bytes_view container) noexcept
328
325
{
329
326
const bytes_view code{header.get_code (container, code_idx)};
330
327
assert (!code.empty ()); // guaranteed by EOF headers validation
@@ -392,11 +389,6 @@ std::variant<InstructionValidationResult, EOFValidationError> validate_instructi
392
389
if (container_idx >= header.container_sizes .size ())
393
390
return EOFValidationError::invalid_container_section_index;
394
391
395
- const auto subcontainer_end =
396
- subcontainer_data_offsets[container_idx] + subcontainer_data_sizes[container_idx];
397
- if (op == OP_EOFCREATE && subcontainer_end != header.container_sizes [container_idx])
398
- return EOFValidationError::eofcreate_with_truncated_container;
399
-
400
392
subcontainer_references.emplace_back (container_idx, Opcode{op});
401
393
++i;
402
394
}
@@ -668,8 +660,6 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
668
660
const auto & [container, header, referenced_by_eofcreate] = container_queue.front ();
669
661
670
662
// Validate subcontainer headers
671
- std::vector<uint16_t > subcontainer_data_offsets;
672
- std::vector<uint16_t > subcontainer_data_sizes;
673
663
std::vector<ContainerValidation> subcontainers;
674
664
for (size_t subcont_idx = 0 ; subcont_idx < header.container_sizes .size (); ++subcont_idx)
675
665
{
@@ -681,11 +671,7 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
681
671
return *error_subcont;
682
672
683
673
auto & subcont_header = std::get<EOF1Header>(error_subcont_or_header);
684
-
685
- subcontainer_data_offsets.push_back (subcont_header.data_offset );
686
- subcontainer_data_sizes.push_back (subcont_header.data_size );
687
-
688
- subcontainers.emplace_back (subcontainer, std::move (subcont_header), false );
674
+ subcontainers.push_back ({subcontainer, std::move (subcont_header), false });
689
675
}
690
676
691
677
// Validate code sections
@@ -703,8 +689,8 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
703
689
visited_code_sections[code_idx] = true ;
704
690
705
691
// Validate instructions
706
- const auto instr_validation_result_or_error = validate_instructions (rev, header,
707
- subcontainer_data_offsets, subcontainer_data_sizes , code_idx, container);
692
+ const auto instr_validation_result_or_error =
693
+ validate_instructions (rev, header , code_idx, container);
708
694
if (const auto * error =
709
695
std::get_if<EOFValidationError>(&instr_validation_result_or_error))
710
696
return *error;
@@ -740,6 +726,9 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
740
726
visited_code_sections.end ())
741
727
return EOFValidationError::unreachable_code_sections;
742
728
729
+ if (referenced_by_eofcreate && !header.can_init (container.size ()))
730
+ return EOFValidationError::eofcreate_with_truncated_container;
731
+
743
732
container_queue.pop ();
744
733
745
734
// enqueue subcontainers
0 commit comments