diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index afbd8f307..84417a6f4 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -2399,10 +2399,7 @@ fn is_hidden(file_path: &DirEntry) -> bool { } #[cfg(not(windows))] { - file_path - .file_name() - .to_str() - .is_some_and(|res| res.starts_with('.')) + file_path.file_name().as_encoded_bytes().starts_with(b".") } } diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index d5e12f234..11365392a 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -7107,3 +7107,15 @@ fn test_ls_recursive_no_fd_leak() { .succeeds() .stderr_is(""); } + +#[test] +#[cfg(all(unix, not(target_os = "macos")))] +fn test_ls_non_utf8_hidden() { + use std::{ffi::OsStr, os::unix::ffi::OsStrExt}; + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.touch(OsStr::from_bytes(b".hidden\x80")); + + scene.ucmd().succeeds().stdout_does_not_contain(".hidden"); +}