Reject non-positive filament_self_index values as well

This commit is contained in:
Hanif Koh
2026-09-01 12:09:28 +08:00
parent ed89a88949
commit da59f51c24

View File

@@ -3142,16 +3142,19 @@ int CLI::run(int argc, char **argv)
ConfigOptionInts* filament_self_index_opt = m_print_config.option<ConfigOptionInts>("filament_self_index"); ConfigOptionInts* filament_self_index_opt = m_print_config.option<ConfigOptionInts>("filament_self_index");
bool need_regenerate_self_index = !filament_self_index_opt; bool need_regenerate_self_index = !filament_self_index_opt;
if (filament_self_index_opt) { if (filament_self_index_opt) {
// a filament_self_index carried over from a project with a different // a filament_self_index carried over from a stale project can disagree with the
// filament_count can imply more distinct filament groups than currently exist. // current filament_count. old_start_indice/old_variant_counts below are sized to
// old_start_indice/old_variant_counts below are sized to filament_count, so an // filament_count and walked with 1-based group indices, so an index above
// unreconciled index walks old_start_indice[++k] past its bounds (heap corruption). // filament_count overruns old_start_indice[++k], and a non-positive first index
int max_self_index = 0; // writes old_variant_counts[-1] - both heap corruption.
for (int v : filament_self_index_opt->values) int max_self_index = 0, min_self_index = 1;
for (int v : filament_self_index_opt->values) {
max_self_index = std::max(max_self_index, v); max_self_index = std::max(max_self_index, v);
if (max_self_index > filament_count) { min_self_index = std::min(min_self_index, v);
BOOST_LOG_TRIVIAL(warning) << boost::format("filament_self_index implies %1% filament groups but filament_count is %2%, regenerating") }
% max_self_index % filament_count; if (max_self_index > filament_count || min_self_index < 1) {
BOOST_LOG_TRIVIAL(warning) << boost::format("filament_self_index range [%1%, %2%] is invalid for filament_count %3%, regenerating")
% min_self_index % max_self_index % filament_count;
need_regenerate_self_index = true; need_regenerate_self_index = true;
} }
} }