From 83e5be8a5285394f2d6528f2250cd7cbef5b64cd Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 12 Aug 2025 00:45:58 +0200 Subject: [PATCH] install: options support non-ut8 too --- src/uu/install/src/install.rs | 18 +++++++++++------- tests/by-util/test_install.rs | 10 ++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index 937b3d23c..903f3928d 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -569,13 +569,17 @@ fn standard(mut paths: Vec, b: &Behavior) -> UResult<()> { if let Some(to_create) = to_create { // if the path ends in /, remove it let to_create_owned; - let to_create = if to_create.to_string_lossy().ends_with('/') { - let path_str = to_create.to_string_lossy(); - let trimmed = path_str.trim_end_matches('/'); - to_create_owned = PathBuf::from(trimmed); - to_create_owned.as_path() - } else { - to_create + let to_create = match uucore::os_str_as_bytes(to_create.as_os_str()) { + Ok(path_bytes) if path_bytes.ends_with(b"/") => { + let mut trimmed_bytes = path_bytes; + while trimmed_bytes.ends_with(b"/") { + trimmed_bytes = &trimmed_bytes[..trimmed_bytes.len() - 1]; + } + let trimmed_os_str = std::ffi::OsStr::from_bytes(trimmed_bytes); + to_create_owned = PathBuf::from(trimmed_os_str); + to_create_owned.as_path() + } + _ => to_create, }; if !to_create.exists() { diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index ded775579..4d1eed3e2 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -2380,4 +2380,14 @@ fn test_install_non_utf8_paths() { at.mkdir(dest_dir); ucmd.arg(&source_filename).arg(dest_dir).succeeds(); + + // Test with trailing slash and directory creation (-D flag) + let (at, mut ucmd) = at_and_ucmd!(); + let source_file = "source.txt"; + let mut target_path = std::ffi::OsString::from_vec(vec![0xFF, 0xFE, b'd', b'i', b'r']); + target_path.push("/target.txt"); + + at.touch(source_file); + + ucmd.arg("-D").arg(source_file).arg(&target_path).succeeds(); }