From fae1099b90a530d756585dc9071675256fe525b4 Mon Sep 17 00:00:00 2001 From: Hanif Koh Date: Wed, 26 Aug 2026 19:05:44 +0800 Subject: [PATCH] Safeguard CLI mode get_at() config functions to prevent crash from missing filament_id --- src/OrcaSlicer.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index 2bd0b22ae4..918c23112d 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -6516,10 +6516,20 @@ int CLI::run(int argc, char **argv) plate_data->nozzle_diameters = nozzle_diameter_str; for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { + // ConfigOptionVector::get_at() falls back to values.front() when the index is out of + // range, but that is undefined behavior when values is empty outright (e.g. filament_ids + // is never populated on a from-scratch slice with no --load-filaments) - guard every + // get_at() here on the vector actually having an entry at it->id before calling it. + bool valid_id = it->id >= 0; std::string display_filament_type; - it->type = m_print_config.get_filament_type(display_filament_type, it->id); - it->color = filament_color ? filament_color->get_at(it->id) : "#FFFFFF"; - it->filament_id = filament_id?filament_id->get_at(it->id):""; + if (valid_id && filament_types && static_cast(it->id) < filament_types->values.size()) + it->type = m_print_config.get_filament_type(display_filament_type, it->id); + it->color = (valid_id && filament_color && static_cast(it->id) < filament_color->values.size()) ? + filament_color->get_at(it->id) : + "#FFFFFF"; + it->filament_id = (valid_id && filament_id && static_cast(it->id) < filament_id->values.size()) ? + filament_id->get_at(it->id) : + ""; } if (!plate_data->plate_thumbnail.is_valid()) {