Skip to content

Commit 64cfef6

Browse files
committed
Refactor: move EOFCREATE truncated container check to level above
1 parent 6ab1b54 commit 64cfef6

File tree

1 file changed

+7
-18
lines changed

1 file changed

+7
-18
lines changed

lib/evmone/eof.cpp

+7-18
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,7 @@ struct InstructionValidationResult
321321
};
322322

323323
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
328325
{
329326
const bytes_view code{header.get_code(container, code_idx)};
330327
assert(!code.empty()); // guaranteed by EOF headers validation
@@ -392,11 +389,6 @@ std::variant<InstructionValidationResult, EOFValidationError> validate_instructi
392389
if (container_idx >= header.container_sizes.size())
393390
return EOFValidationError::invalid_container_section_index;
394391

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-
400392
subcontainer_references.emplace_back(container_idx, Opcode{op});
401393
++i;
402394
}
@@ -668,8 +660,6 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
668660
const auto& [container, header, referenced_by_eofcreate] = container_queue.front();
669661

670662
// Validate subcontainer headers
671-
std::vector<uint16_t> subcontainer_data_offsets;
672-
std::vector<uint16_t> subcontainer_data_sizes;
673663
std::vector<ContainerValidation> subcontainers;
674664
for (size_t subcont_idx = 0; subcont_idx < header.container_sizes.size(); ++subcont_idx)
675665
{
@@ -681,11 +671,7 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
681671
return *error_subcont;
682672

683673
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});
689675
}
690676

691677
// Validate code sections
@@ -703,8 +689,8 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
703689
visited_code_sections[code_idx] = true;
704690

705691
// 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);
708694
if (const auto* error =
709695
std::get_if<EOFValidationError>(&instr_validation_result_or_error))
710696
return *error;
@@ -740,6 +726,9 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
740726
visited_code_sections.end())
741727
return EOFValidationError::unreachable_code_sections;
742728

729+
if (referenced_by_eofcreate && !header.can_init(container.size()))
730+
return EOFValidationError::eofcreate_with_truncated_container;
731+
743732
container_queue.pop();
744733

745734
// enqueue subcontainers

0 commit comments

Comments
 (0)