Skip to content

Commit d7d2936

Browse files
committed
Refactor: validate subcontainer headers in the end of validation
1 parent 64cfef6 commit d7d2936

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

lib/evmone/eof.cpp

+20-20
Original file line numberDiff line numberDiff line change
@@ -659,25 +659,13 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
659659
{
660660
const auto& [container, header, referenced_by_eofcreate] = container_queue.front();
661661

662-
// Validate subcontainer headers
663-
std::vector<ContainerValidation> subcontainers;
664-
for (size_t subcont_idx = 0; subcont_idx < header.container_sizes.size(); ++subcont_idx)
665-
{
666-
const bytes_view subcontainer{header.get_container(container, subcont_idx)};
667-
668-
auto error_subcont_or_header = validate_header(rev, subcontainer);
669-
if (const auto* error_subcont =
670-
std::get_if<EOFValidationError>(&error_subcont_or_header))
671-
return *error_subcont;
672-
673-
auto& subcont_header = std::get<EOF1Header>(error_subcont_or_header);
674-
subcontainers.push_back({subcontainer, std::move(subcont_header), false});
675-
}
676-
677662
// Validate code sections
678663
std::vector<bool> visited_code_sections(header.code_sizes.size());
679664
std::queue<uint16_t> code_sections_queue({0});
680665

666+
const auto subcontainer_count = header.container_sizes.size();
667+
std::vector<bool> subcontainer_referenced_by_eofcreate(subcontainer_count, false);
668+
681669
while (!code_sections_queue.empty())
682670
{
683671
const auto code_idx = code_sections_queue.front();
@@ -702,7 +690,7 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
702690
for (const auto& [index, opcode] : subcontainer_references)
703691
{
704692
if (opcode == OP_EOFCREATE)
705-
subcontainers[index].referenced_by_eofcreate = true;
693+
subcontainer_referenced_by_eofcreate[index] = true;
706694
}
707695

708696
// TODO(C++23): can use push_range()
@@ -729,11 +717,23 @@ EOFValidationError validate_eof1(evmc_revision rev, bytes_view main_container) n
729717
if (referenced_by_eofcreate && !header.can_init(container.size()))
730718
return EOFValidationError::eofcreate_with_truncated_container;
731719

732-
container_queue.pop();
720+
// Enqueue subcontainers
721+
for (size_t subcont_idx = 0; subcont_idx < subcontainer_count; ++subcont_idx)
722+
{
723+
const bytes_view subcontainer{header.get_container(container, subcont_idx)};
724+
725+
auto error_subcont_or_header = validate_header(rev, subcontainer);
726+
if (const auto* error_subcont =
727+
std::get_if<EOFValidationError>(&error_subcont_or_header))
728+
return *error_subcont;
729+
730+
auto& subcont_header = std::get<EOF1Header>(error_subcont_or_header);
733731

734-
// enqueue subcontainers
735-
for (auto& subcontainer : subcontainers)
736-
container_queue.emplace(std::move(subcontainer));
732+
container_queue.emplace(subcontainer, std::move(subcont_header),
733+
subcontainer_referenced_by_eofcreate[subcont_idx]);
734+
}
735+
736+
container_queue.pop();
737737
}
738738

739739
return EOFValidationError::success;

0 commit comments

Comments
 (0)