From f4297e365f26d468d61b8a7015121fe99eb30bcc Mon Sep 17 00:00:00 2001 From: Skgland Date: Mon, 11 Aug 2025 23:20:48 +0200 Subject: [PATCH] don't crash on empty list and differentiate list head not being string like --- src/machine/system_calls.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 2d8b230e..8ba4fd4c 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -5018,15 +5018,21 @@ impl Machine { // the tail are the struct field values let mut iter = args.into_iter(); - if let Some(struct_name) = machine_st.value_to_str_like(iter.next().unwrap()) { - Ok(Value::Struct( - struct_name.as_str().to_string(), - iter.map(|x| Self::map_ffi_arg(machine_st, x, stub_gen)) - .collect::>()?, - )) + + if let Some(head) = iter.next() { + if let Some(struct_name) = machine_st.value_to_str_like(head) { + Ok(Value::Struct( + struct_name.as_str().to_string(), + iter.map(|x| Self::map_ffi_arg(machine_st, x, stub_gen)) + .collect::>()?, + )) + } else { + // first element of a struct needs to be the type + Err(machine_st.error_form(machine_st.ffi_error(FfiError::ValueOutOfRange, head), stub_gen())) + } } else { // empty list is an invalid struct repr - Err(machine_st.error_form(machine_st.ffi_error(FfiError::InvalidStruct, source), stub_gen())) + Err(machine_st.error_form(machine_st.ffi_error(FfiError::ValueOutOfRange, source), stub_gen())) } } else { Err(machine_st.error_form(machine_st.ffi_error(FfiError::InvalidArgument, source), stub_gen())) -- 2.54.0