diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 64281e5756a..4d9cd0a1233 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -131,7 +131,8 @@ impl Options { (tmpdir, OsString::from(template)) } Some(template) => { - let tmpdir = if let Some(tmpdir) = env::var_os(TMPDIR_ENV_VAR) + let tmpdir = if let Some(tmpdir) = + env::var_os(TMPDIR_ENV_VAR).filter(|dir| !dir.is_empty()) && matches.get_flag(OPT_T) { Some(PathBuf::from(tmpdir)) @@ -140,13 +141,7 @@ impl Options { } else if matches.get_flag(OPT_T) || matches.contains_id(OPT_TMPDIR) { // If --tmpdir is given without an argument, or -t is given // export in TMPDIR - #[cfg(target_os = "wasi")] - // WASI's `std::env::temp_dir()` unconditionally panics - let default_tmp_dir = env::var_os(TMPDIR_ENV_VAR) - .map_or_else(|| PathBuf::from(FALLBACK_TMPDIR), PathBuf::from); - #[cfg(not(target_os = "wasi"))] - let default_tmp_dir = env::temp_dir(); - Some(default_tmp_dir) + Some(get_tmpdir_env_or_default()) } else { None }; diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index ca93e30b466..348b053d4df 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -937,6 +937,31 @@ fn test_empty_tmpdir_env_var() { } } +#[test] +#[cfg(not(any(windows, target_os = "android")))] +#[cfg_attr(wasi_runner, ignore = "WASI sandbox: host paths not visible")] +fn test_empty_tmpdir_env_var_with_template() { + for args in [ + &["-t", "fooXXX"][..], + &["-d", "-t", "fooXXX"], + &["--tmpdir", "fooXXX"], + ] { + let result = new_ucmd!().env(TMPDIR, "").args(args).succeeds(); + let path = result.stdout_str().trim_end(); + assert!(path.starts_with("/tmp/foo"), "{args:?}: {path}"); + } + + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("d"); + let dir = at.plus_as_string("d"); + let result = ucmd + .env(TMPDIR, "") + .args(&["-p", &dir, "-t", "fooXXX"]) + .succeeds(); + let path = result.stdout_str().trim_end(); + assert!(path.starts_with(&format!("{dir}/foo")), "{path}"); +} + #[test] fn test_nonexistent_dir_prefix() { #[cfg(not(windows))]