diff --git a/src/mxc-sdk/src/backends/process_container/common/appcontainer_runner.rs b/src/mxc-sdk/src/backends/process_container/common/appcontainer_runner.rs index d3eabc205..a3cff3cac 100644 --- a/src/mxc-sdk/src/backends/process_container/common/appcontainer_runner.rs +++ b/src/mxc-sdk/src/backends/process_container/common/appcontainer_runner.rs @@ -118,7 +118,7 @@ fn create_process_failure( /// Entries are sorted case-insensitively by key as required by `CreateProcessW`. pub(crate) fn encode_env_block(entries: &[(String, String)]) -> Vec { let mut sorted: Vec<&(String, String)> = entries.iter().collect(); - sorted.sort_by(|(a, _), (b, _)| a.to_ascii_uppercase().cmp(&b.to_ascii_uppercase())); + sorted.sort_by_key(|(key, _)| key.to_ascii_uppercase()); let mut block = Vec::new(); for (key, value) in sorted { @@ -2595,6 +2595,18 @@ mod tests { assert_eq!(parsed[1].0, "Zebra"); } + #[test] + fn encode_env_block_preserves_order_for_case_insensitive_equal_keys() { + let entries = vec![ + ("Alpha".to_string(), "first".to_string()), + ("alpha".to_string(), "second".to_string()), + ("Beta".to_string(), "third".to_string()), + ]; + let block = super::encode_env_block(&entries); + let parsed = super::parse_environment_block(block.as_ptr()); + assert_eq!(parsed, entries); + } + #[test] fn encode_env_block_empty_input_is_double_null_terminated() { assert_eq!(super::encode_env_block(&[]), vec![0u16, 0u16]);