From 8acbf51101e68163b8813acedf6e9d519466a6a0 Mon Sep 17 00:00:00 2001 From: oech3 <79379754+oech3@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:27:38 +0900 Subject: [PATCH] chroot: extract proper error message from OS --- src/uu/chroot/locales/en-US.ftl | 1 - src/uu/chroot/locales/fr-FR.ftl | 1 - src/uu/chroot/src/chroot.rs | 4 ---- src/uu/chroot/src/error.rs | 4 ---- tests/by-util/test_chroot.rs | 30 ++++++++++++++++++++++++++---- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/uu/chroot/locales/en-US.ftl b/src/uu/chroot/locales/en-US.ftl index 24c109c406e..496cb8400b8 100644 --- a/src/uu/chroot/locales/en-US.ftl +++ b/src/uu/chroot/locales/en-US.ftl @@ -19,7 +19,6 @@ chroot-error-missing-newroot = Missing operand: NEWROOT chroot-error-no-group-specified = no group specified for unknown uid: { $uid } chroot-error-no-such-user = invalid user chroot-error-no-such-group = invalid group -chroot-error-no-such-directory = cannot change root directory to { $dir }: no such directory chroot-error-set-gid-failed = cannot set gid to { $gid }: { $err } chroot-error-set-groups-failed = cannot set groups: { $err } chroot-error-set-user-failed = cannot set user to { $user }: { $err } diff --git a/src/uu/chroot/locales/fr-FR.ftl b/src/uu/chroot/locales/fr-FR.ftl index caabd169b2b..04fedb47aee 100644 --- a/src/uu/chroot/locales/fr-FR.ftl +++ b/src/uu/chroot/locales/fr-FR.ftl @@ -19,7 +19,6 @@ chroot-error-missing-newroot = Opérande manquant : NOUVRACINE chroot-error-no-group-specified = aucun groupe spécifié pour l'uid inconnu : { $uid } chroot-error-no-such-user = utilisateur invalide chroot-error-no-such-group = groupe invalide -chroot-error-no-such-directory = impossible de changer le répertoire racine vers { $dir } : aucun répertoire de ce type chroot-error-set-gid-failed = impossible de définir le gid à { $gid } : { $err } chroot-error-set-groups-failed = impossible de définir les groupes : { $err } chroot-error-set-user-failed = impossible de définir l'utilisateur à { $user } : { $err } diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index 30efdee0a1a..4a092e218aa 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -194,10 +194,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { options.chroot_target = resolved; } - if !options.newroot.is_dir() { - return Err(ChrootError::NoSuchDirectory(options.newroot).into()); - } - let mut cmd_iter = matches .get_many::(options::COMMAND) .into_iter() diff --git a/src/uu/chroot/src/error.rs b/src/uu/chroot/src/error.rs index 0592d72efad..ff9f73f8d50 100644 --- a/src/uu/chroot/src/error.rs +++ b/src/uu/chroot/src/error.rs @@ -52,10 +52,6 @@ pub enum ChrootError { #[error("{}", translate!("chroot-error-no-such-group"))] NoSuchGroup, - /// The given directory does not exist. - #[error("{}", translate!("chroot-error-no-such-directory", "dir" => _0.quote()))] - NoSuchDirectory(PathBuf), - /// The call to `setgid()` failed. #[error("{}", translate!("chroot-error-set-gid-failed", "gid" => _0, "err" => _1))] SetGidFailed(String, #[source] Error), diff --git a/tests/by-util/test_chroot.rs b/tests/by-util/test_chroot.rs index 66e10927740..daa1780bd14 100644 --- a/tests/by-util/test_chroot.rs +++ b/tests/by-util/test_chroot.rs @@ -46,14 +46,36 @@ fn test_enter_chroot_fails() { } #[test] -fn test_no_such_directory() { - let (at, mut ucmd) = at_and_ucmd!(); +#[cfg(target_env = "gnu")] // todo: override by proper error message on other platforms +fn test_too_long_name() { + let (_at, mut ucmd) = at_and_ucmd!(); + let long_name = "a".repeat(256); - at.touch(at.plus_as_string("a")); + ucmd.arg(&long_name) + .fails_with_code(125) + .stderr_contains(format!( + "chroot: cannot chroot to '{long_name}': File name too long", //todo strip errno + )); +} + +#[test] +#[cfg(target_env = "gnu")] // todo: override by proper error message on other platforms +fn test_no_such() { + let (_at, mut ucmd) = at_and_ucmd!(); + ucmd.arg("missing") + .fails_with_code(125) + .stderr_contains("chroot: cannot chroot to 'missing': No such file or directory"); // todo: strip errno +} + +#[test] +#[cfg(target_env = "gnu")] // todo: override by proper error message on other platforms +fn test_not_a_directory() { + let (at, mut ucmd) = at_and_ucmd!(); + at.touch(at.plus_as_string("a")); ucmd.arg("a") .fails_with_code(125) - .stderr_is("chroot: cannot change root directory to 'a': no such directory\n"); + .stderr_contains("chroot: cannot chroot to 'a': Not a directory"); // todo: strip errno } #[test]