From 3862a031a932a9f995708c372dea776eeca9b7aa Mon Sep 17 00:00:00 2001 From: armada Date: Fri, 23 Oct 2026 18:16:49 +0300 Subject: [PATCH 1/2] ls: report invalid file names as "cannot access" instead of an unknown io error Errors without a dedicated message (e.g. ERROR_INVALID_NAME on Windows for `*` or `<`, or a name that is too long) were printed as "unknown io error" with the Debug form of io::Error. Print them like the other access errors, using the OS message. Co-Authored-By: Claude Opus 5.5 --- src/uu/ls/locales/en-US.ftl | 2 +- src/uu/ls/locales/fr-FR.ftl | 2 +- src/uu/ls/src/ls.rs | 2 +- tests/by-util/test_ls.rs | 26 ++++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/uu/ls/locales/en-US.ftl b/src/uu/ls/locales/en-US.ftl index 075ec37bf86..b4c19eac1ad 100644 --- a/src/uu/ls/locales/en-US.ftl +++ b/src/uu/ls/locales/en-US.ftl @@ -20,7 +20,7 @@ ls-error-cannot-access-operation-not-permitted = cannot access {$path}: Operatio ls-error-cannot-open-directory-permission-denied = cannot open directory {$path}: Permission denied ls-error-cannot-access-permission-denied = cannot access {$path}: Permission denied ls-error-cannot-open-directory-bad-descriptor = cannot open directory {$path}: Bad file descriptor -ls-error-unknown-io-error = unknown io error: {$path}, '{$error}' +ls-error-cannot-access = cannot access {$path}: {$error} ls-error-invalid-block-size = invalid --block-size argument {$size} ls-error-dired-and-zero-incompatible = --dired and --zero are incompatible ls-error-not-directory = cannot access {$path}: Not a directory diff --git a/src/uu/ls/locales/fr-FR.ftl b/src/uu/ls/locales/fr-FR.ftl index 06a1a6aa6d4..5403cdd2df5 100644 --- a/src/uu/ls/locales/fr-FR.ftl +++ b/src/uu/ls/locales/fr-FR.ftl @@ -19,7 +19,7 @@ ls-error-cannot-access-operation-not-permitted = impossible d'accéder à {$path ls-error-cannot-open-directory-permission-denied = impossible d'ouvrir le répertoire {$path} : Permission refusée ls-error-cannot-access-permission-denied = impossible d'accéder à {$path} : Permission refusée ls-error-cannot-open-directory-bad-descriptor = impossible d'ouvrir le répertoire {$path} : Mauvais descripteur de fichier -ls-error-unknown-io-error = erreur d'E/S inconnue : {$path}, '{$error}' +ls-error-cannot-access = impossible d'accéder à {$path} : {$error} ls-error-invalid-block-size = argument --block-size invalide {$size} ls-error-dired-and-zero-incompatible = --dired et --zero sont incompatibles ls-error-not-listing-already-listed = {$path} : ne liste pas un répertoire déjà listé diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index ec3479b1cdd..6d3051092d9 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -83,7 +83,7 @@ enum LsError { _ => if 9 == .1.raw_os_error().unwrap_or(1) { translate!("ls-error-cannot-open-directory-bad-descriptor", "path" => .0.quote()) } else { - translate!("ls-error-unknown-io-error", "path" => .0.quote(), "error" => format!("{:?}", .1)) + translate!("ls-error-cannot-access", "path" => .0.quote(), "error" => strip_errno(.1)) }, })] IOErrorContext(PathBuf, std::io::Error, bool), diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 97f925a4de2..2b2c30a84af 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -71,6 +71,32 @@ fn test_directory_in_file() { .stderr_is("ls: cannot access 'file/missing': Not a directory\n"); } +#[test] +fn test_name_too_long() { + let name = "a".repeat(300); + new_ucmd!() + .arg(&name) + .fails_with_code(2) + .stderr_contains(format!("ls: cannot access '{name}': ")) + .stderr_does_not_contain("unknown io error") + .stderr_does_not_contain("os error"); +} + +#[test] +#[cfg(windows)] +fn test_invalid_filename_windows() { + // `*` and `<` cannot appear in a Windows file name, so the lookup fails + // with ERROR_INVALID_NAME rather than "not found" + for name in ["a*", "a Date: Mon, 26 Oct 2026 00:09:00 +0300 Subject: [PATCH 2/2] ls: tighten invalid file name test per review --- tests/by-util/test_ls.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 2b2c30a84af..a372cd0042c 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -74,11 +74,12 @@ fn test_directory_in_file() { #[test] fn test_name_too_long() { let name = "a".repeat(300); - new_ucmd!() - .arg(&name) - .fails_with_code(2) + let result = new_ucmd!().arg(&name).fails_with_code(2); + #[cfg(unix)] + result.stderr_is(format!("ls: cannot access '{name}': File name too long\n")); + #[cfg(not(unix))] + result .stderr_contains(format!("ls: cannot access '{name}': ")) - .stderr_does_not_contain("unknown io error") .stderr_does_not_contain("os error"); }