diff --git a/src/uu/mktemp/locales/en-US.ftl b/src/uu/mktemp/locales/en-US.ftl index 10c10f03740..a7030e822cf 100644 --- a/src/uu/mktemp/locales/en-US.ftl +++ b/src/uu/mktemp/locales/en-US.ftl @@ -19,6 +19,8 @@ mktemp-error-suffix-contains-separator = invalid suffix { $suffix }, contains di mktemp-error-invalid-template = invalid template, { $template }; with --tmpdir, it may not be absolute mktemp-error-too-many-templates = too many templates mktemp-error-not-found = failed to create { $template_type } via template { $template }: No such file or directory +mktemp-error-failed-print = failed to print directory name +mktemp-error-failed-to-create-file-via-template = failed to create file via template { $path }: { $error } # Template types mktemp-template-type-directory = directory diff --git a/src/uu/mktemp/locales/fr-FR.ftl b/src/uu/mktemp/locales/fr-FR.ftl index 2a0eff74901..64dace3b6e8 100644 --- a/src/uu/mktemp/locales/fr-FR.ftl +++ b/src/uu/mktemp/locales/fr-FR.ftl @@ -19,6 +19,8 @@ mktemp-error-suffix-contains-separator = suffixe invalide { $suffix }, contient mktemp-error-invalid-template = modèle invalide, { $template } ; avec --tmpdir, il ne peut pas être absolu mktemp-error-too-many-templates = trop de modèles mktemp-error-not-found = échec de la création de { $template_type } via le modèle { $template } : Aucun fichier ou répertoire de ce type +mktemp-error-failed-print = échec de l'affichage du nom de répertoire +mktemp-error-failed-to-create-file-via-template = fichier à créer à partir d'un modèle { $path }: { $error } # Types de modèle mktemp-template-type-directory = répertoire diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 789a19e4543..f6778c2de83 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -72,6 +72,9 @@ enum MkTempError { #[error("{}", translate!("mktemp-error-not-found", "template_type" => .0, "template" => .1.quote()))] NotFound(String, PathBuf), + + #[error("{}", translate!("mktemp-error-failed-to-create-file-via-template", "path" => .0.quote(), "error" => .1 ))] + FailedToCreate(PathBuf, String), } impl UError for MkTempError { @@ -560,7 +563,11 @@ fn make_temp_dir(dir: &Path, prefix: &str, rand: usize, suffix: &str) -> UResult let path = Path::new(dir).join(filename); Err(MkTempError::NotFound(translate!("mktemp-template-type-directory"), path).into()) } - Err(e) => Err(e.into()), + Err(e) => { + let filename = format!("{prefix}{}{suffix}", "X".repeat(rand)); + let path = Path::new(dir).join(filename); + Err(MkTempError::FailedToCreate(path, uucore::error::strip_errno(&e)).into()) + } } } @@ -589,7 +596,11 @@ fn make_temp_file(dir: &Path, prefix: &str, rand: usize, suffix: &str) -> UResul let path = Path::new(dir).join(filename); Err(MkTempError::NotFound(translate!("mktemp-template-type-file"), path).into()) } - Err(e) => Err(e.into()), + Err(e) => { + let filename = format!("{prefix}{}{suffix}", "X".repeat(rand)); + let path = Path::new(dir).join(filename); + Err(MkTempError::FailedToCreate(path, uucore::error::strip_errno(&e)).into()) + } } } diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 7187b5bf4c5..9d3a489fca5 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -1269,3 +1269,37 @@ fn test_write_error_removes_the_temporary_directory() { .collect(); assert!(leftovers.is_empty(), "left behind: {leftovers:?}"); } + +#[test] +#[cfg(unix)] +fn test_permission_denied_no_os_error() { + use rustix::process::geteuid; + use std::fs; + use std::os::unix::fs::PermissionsExt; + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + if geteuid().is_root() { + return; + } + + at.mkdir("dir"); + fs::set_permissions(at.plus("dir"), fs::Permissions::from_mode(0o444)).unwrap(); + + scene + .ucmd() + .args(&["-p", "dir"]) + .fails_with_code(1) + .stderr_is( + "mktemp: failed to create file via template 'dir/tmp.XXXXXXXXXX': Permission denied\n", + ); + + scene + .ucmd() + .args(&["-d", "-p", "dir"]) + .fails_with_code(1) + .stderr_is( + "mktemp: failed to create file via template 'dir/tmp.XXXXXXXXXX': Permission denied\n", + ); +}