Skip to content

Commit

Permalink
mktemp: error on path separator in template prefix
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jfinkels authored and sylvestre committed May 11, 2022
1 parent 0ebd9c9 commit 2874f18
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
28 changes: 20 additions & 8 deletions src/uu/mktemp/src/mktemp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@ enum MkTempError {
PersistError(PathBuf),
MustEndInX(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),
}

Expand All @@ -56,7 +61,14 @@ impl Display for MkTempError {
PersistError(p) => write!(f, "could not persist file {}", p.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()),
ContainsDirSeparator(s) => {
PrefixContainsDirSeparator(s) => {
write!(
f,
"invalid template, {}, contains directory separator",
s.quote()
)
}
SuffixContainsDirSeparator(s) => {
write!(
f,
"invalid suffix {}, contains directory separator",
Expand Down Expand Up @@ -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) {
return Err(MkTempError::ContainsDirSeparator(suf.into()));
return Err(MkTempError::SuffixContainsDirSeparator(suf.into()));
}

Ok((prefix, rand, suf))
Expand Down Expand Up @@ -352,11 +368,7 @@ mod tests {

#[test]
fn test_parse_template_errors() {
// TODO This should be an error as well, but we are not
// catching it just yet. A future commit will correct this.
//
// assert!(parse_template("a/bXXX", None).is_err());
//
assert!(parse_template("a/bXXX", None).is_err());
assert!(parse_template("XXXa/b", None).is_err());
assert!(parse_template("XX", None).is_err());
assert!(parse_template("XXXabc", Some("def")).is_err());
Expand Down
14 changes: 14 additions & 0 deletions tests/by-util/test_mktemp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

use crate::common::util::*;

use uucore::display::Quotable;

use std::path::PathBuf;
use tempfile::tempdir;

Expand Down Expand Up @@ -482,3 +484,15 @@ fn test_respect_template_directory() {
assert_matches_template!(template, 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()
));
}

0 comments on commit 2874f18

Please sign in to comment.