1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 19:47:45 +00:00

mktemp: error on path separator in template prefix

Correct the error that arises from a path separator in the prefix
portion of a template argument provided to `mktemp`. Before this
commit, the error message was incorrect:

    $ mktemp -t a/bXXX
    mktemp: failed to create file via template 'a/bXXX': No such file or directory (os error 2) at path "/tmp/a/bege"

After this commit, the error message is correct:

    $ mktemp -t a/bXXX
    mktemp: invalid template, 'a/bXXX', contains directory separator

The code was failing to check for a path separator in the prefix
portion of the template.
This commit is contained in:
Jeffrey Finkelstein 2022-05-05 18:05:16 -04:00 committed by Sylvestre Ledru
parent 0ebd9c9391
commit 2874f18950
2 changed files with 34 additions and 8 deletions

View file

@ -41,7 +41,12 @@ enum MkTempError {
PersistError(PathBuf), PersistError(PathBuf),
MustEndInX(String), MustEndInX(String),
TooFewXs(String), TooFewXs(String),
ContainsDirSeparator(String),
/// The template prefix contains a path separator (e.g. `"a/bXXX"`).
PrefixContainsDirSeparator(String),
/// The template suffix contains a path separator (e.g. `"XXXa/b"`).
SuffixContainsDirSeparator(String),
InvalidTemplate(String), InvalidTemplate(String),
} }
@ -56,7 +61,14 @@ impl Display for MkTempError {
PersistError(p) => write!(f, "could not persist file {}", p.quote()), PersistError(p) => write!(f, "could not persist file {}", p.quote()),
MustEndInX(s) => write!(f, "with --suffix, template {} must end in X", s.quote()), MustEndInX(s) => write!(f, "with --suffix, template {} must end in X", s.quote()),
TooFewXs(s) => write!(f, "too few X's in template {}", s.quote()), TooFewXs(s) => write!(f, "too few X's in template {}", s.quote()),
ContainsDirSeparator(s) => { PrefixContainsDirSeparator(s) => {
write!(
f,
"invalid template, {}, contains directory separator",
s.quote()
)
}
SuffixContainsDirSeparator(s) => {
write!( write!(
f, f,
"invalid suffix {}, contains directory separator", "invalid suffix {}, contains directory separator",
@ -252,8 +264,12 @@ fn parse_template<'a>(
} }
}; };
if prefix.chars().any(is_separator) {
return Err(MkTempError::PrefixContainsDirSeparator(temp.into()));
}
if suf.chars().any(is_separator) { if suf.chars().any(is_separator) {
return Err(MkTempError::ContainsDirSeparator(suf.into())); return Err(MkTempError::SuffixContainsDirSeparator(suf.into()));
} }
Ok((prefix, rand, suf)) Ok((prefix, rand, suf))
@ -352,11 +368,7 @@ mod tests {
#[test] #[test]
fn test_parse_template_errors() { fn test_parse_template_errors() {
// TODO This should be an error as well, but we are not assert!(parse_template("a/bXXX", None).is_err());
// catching it just yet. A future commit will correct this.
//
// assert!(parse_template("a/bXXX", None).is_err());
//
assert!(parse_template("XXXa/b", None).is_err()); assert!(parse_template("XXXa/b", None).is_err());
assert!(parse_template("XX", None).is_err()); assert!(parse_template("XX", None).is_err());
assert!(parse_template("XXXabc", Some("def")).is_err()); assert!(parse_template("XXXabc", Some("def")).is_err());

View file

@ -2,6 +2,8 @@
use crate::common::util::*; use crate::common::util::*;
use uucore::display::Quotable;
use std::path::PathBuf; use std::path::PathBuf;
use tempfile::tempdir; use tempfile::tempdir;
@ -482,3 +484,15 @@ fn test_respect_template_directory() {
assert_matches_template!(template, filename); assert_matches_template!(template, filename);
assert!(at.file_exists(filename)); assert!(at.file_exists(filename));
} }
/// Test that a template with a path separator is invalid.
#[test]
fn test_template_path_separator() {
new_ucmd!()
.args(&["-t", "a/bXXX"])
.fails()
.stderr_only(format!(
"mktemp: invalid template, {}, contains directory separator\n",
"a/bXXX".quote()
));
}