From 20793600f7e44aee45bcf726c559f3ca83de43b4 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 8 Aug 2025 15:15:54 +0200 Subject: [PATCH] Fix csplit to handle non-UTF-8 filenames --- src/uu/csplit/src/csplit.rs | 6 ++++-- tests/by-util/test_csplit.rs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index fc18b97da..a3e10e2b0 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -6,6 +6,7 @@ #![allow(rustdoc::private_intra_doc_links)] use std::cmp::Ordering; +use std::ffi::OsString; use std::io::{self, BufReader, ErrorKind}; use std::{ fs::{File, remove_file}, @@ -608,7 +609,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().get_matches_from_localized(args); // get the file to split - let file_name = matches.get_one::(options::FILE).unwrap(); + let file_name = matches.get_one::(options::FILE).unwrap(); // get the patterns to split on let patterns: Vec = matches @@ -689,7 +690,8 @@ pub fn uu_app() -> Command { Arg::new(options::FILE) .hide(true) .required(true) - .value_hint(clap::ValueHint::FilePath), + .value_hint(clap::ValueHint::FilePath) + .value_parser(clap::value_parser!(OsString)), ) .arg( Arg::new(options::PATTERN) diff --git a/tests/by-util/test_csplit.rs b/tests/by-util/test_csplit.rs index ea1d9ebf9..b13d6c35d 100644 --- a/tests/by-util/test_csplit.rs +++ b/tests/by-util/test_csplit.rs @@ -1501,3 +1501,15 @@ fn test_stdin_no_trailing_newline() { .succeeds() .stdout_only("2\n5\n"); } + +#[test] +#[cfg(target_os = "linux")] +fn test_csplit_non_utf8_paths() { + use std::os::unix::ffi::OsStringExt; + let (at, mut ucmd) = at_and_ucmd!(); + + let filename = std::ffi::OsString::from_vec(vec![0xFF, 0xFE]); + std::fs::write(at.plus(&filename), b"line1\nline2\nline3\nline4\nline5\n").unwrap(); + + ucmd.arg(&filename).arg("3").succeeds(); +}