aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorian <13469873+VialFlorian@users.noreply.github.com>2026-08-02 22:05:23 +0200
committerGitHub <noreply@github.com>2026-08-02 23:05:23 +0300
commit0f14e279a783f456f3506086a0945cc8fb15a66c (patch)
tree4e5e9b2fa83380f0e132f6470f49a1ade748697f /src
parent890113943999bd0332f535864b982190907449c4 (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/main.rs56
1 files changed, 55 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 7b8613f8..27c1d92f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -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"
+ );
+ }
}