fix(cli): report non-UTF-8 arguments instead of panicking (#2207)

* fix(cli): report non-UTF-8 arguments instead of panicking

* fix(cli): avoid echoing malformed arguments

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
This commit is contained in:
Florian 2026-08-02 22:05:23 +02:00 committed by GitHub
parent 8901139439
commit 0f14e279a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 55 additions and 1 deletions

View File

@ -464,8 +464,28 @@ fn exit_if_nested_disabled(config: &config::Config) {
}
}
fn args_as_utf8<I>(args: I) -> Result<Vec<String>, String>
where
I: IntoIterator<Item = std::ffi::OsString>,
{
args.into_iter()
.enumerate()
.map(|(index, arg)| {
arg.into_string()
.map_err(|_| format!("argument {index} is not valid UTF-8"))
})
.collect()
}
fn main() -> io::Result<()> {
let raw_args: Vec<String> = std::env::args().collect();
let raw_args: Vec<String> = match args_as_utf8(std::env::args_os()) {
Ok(args) => args,
Err(err) => {
eprintln!("error: {err}");
eprintln!("run 'herdr --help' for usage");
std::process::exit(2);
}
};
let args = match session::configure_from_args(&raw_args) {
Ok(args) => args,
Err(err) => {
@ -905,4 +925,38 @@ mod tests {
.iter()
.all(|message| !message.starts_with("herdr:")));
}
#[cfg(unix)]
fn invalid_utf8_arg() -> std::ffi::OsString {
use std::os::unix::ffi::OsStringExt;
std::ffi::OsString::from_vec(vec![0xff])
}
#[cfg(windows)]
fn invalid_utf8_arg() -> std::ffi::OsString {
use std::os::windows::ffi::OsStringExt;
std::ffi::OsString::from_wide(&[0xd800])
}
#[test]
fn args_as_utf8_passes_through_valid_arguments() {
let args = ["herdr", "pane", "get", "pane-1"].map(std::ffi::OsString::from);
assert_eq!(
args_as_utf8(args).unwrap(),
["herdr", "pane", "get", "pane-1"]
);
}
#[test]
fn args_as_utf8_reports_the_offending_argument_instead_of_panicking() {
let args = vec![
std::ffi::OsString::from("herdr"),
std::ffi::OsString::from("pane"),
invalid_utf8_arg(),
];
assert_eq!(
args_as_utf8(args).unwrap_err(),
"argument 2 is not valid UTF-8"
);
}
}