diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 20b95f009..541b1310e 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -139,12 +139,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let dry_run = matches.is_present(OPT_DRY_RUN); let suppress_file_err = matches.is_present(OPT_QUIET); - let (prefix, rand, suffix) = parse_template(template, matches.value_of(OPT_SUFFIX))?; - - if matches.is_present(OPT_TMPDIR) && PathBuf::from(prefix).is_absolute() { + // If `--tmpdir` is given, the template cannot be an absolute + // path. For example, `mktemp --tmpdir=a /XXX` is not allowed. + if matches.is_present(OPT_TMPDIR) && PathBuf::from(template).is_absolute() { return Err(MkTempError::InvalidTemplate(template.into()).into()); } + let (prefix, rand, suffix) = parse_template(template, matches.value_of(OPT_SUFFIX))?; + let res = if dry_run { dry_exec(tmpdir, prefix, rand, suffix) } else { diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 9fce0e591..8cdddd82c 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -414,6 +414,22 @@ fn test_mktemp_directory_tmpdir() { assert!(PathBuf::from(result.stdout_str().trim()).is_dir()); } +/// Test that an absolute path is disallowed when --tmpdir is provided. +#[test] +fn test_tmpdir_absolute_path() { + #[cfg(windows)] + let path = r"C:\XXX"; + #[cfg(not(windows))] + let path = "/XXX"; + new_ucmd!() + .args(&["--tmpdir=a", path]) + .fails() + .stderr_only(format!( + "mktemp: invalid template, '{}'; with --tmpdir, it may not be absolute\n", + path + )); +} + /// Decide whether a string matches a given template. /// /// In the template, the character `'X'` is treated as a wildcard,