diff options
author | Ron Yorston <rmy@tigress.co.uk> | 2012-10-08 11:47:22 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-10-08 11:47:22 +0200 |
commit | eab343e7e1e5331df833aa69f14584e4a6c738f1 (patch) | |
tree | ca06fdb10773a4ff8481cb72468849c7b55cf150 | |
parent | 8dc6d1a813e2be33ecfcf3fa97a1b5aae05a8631 (diff) | |
download | busybox-eab343e7e1e5331df833aa69f14584e4a6c738f1.tar.gz |
mktemp: fix mktemp -u temp.XXXXXX returning garbage when TMPDIR is set
Use mktemp instead of tempnam for compatibility with real mktemp.
Don't let mktemp fail silently, print some simple error messages.
Don't ignore -q.
Signed-off-by: Tito Ragusa <farmatito@tiscali.it>
Signed-off-by: Ron Yorston <rmy@tigress.co.uk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | debianutils/mktemp.c | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/debianutils/mktemp.c b/debianutils/mktemp.c index dbe430955..983d7a246 100644 --- a/debianutils/mktemp.c +++ b/debianutils/mktemp.c @@ -38,7 +38,7 @@ //usage: "TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX).\n" //usage: "Without TEMPLATE, -t tmp.XXXXXX is assumed.\n" //usage: "\n -d Make directory, not file" -////usage: "\n -q Fail silently on errors" - we ignore this opt +//usage: "\n -q Fail silently on errors" //usage: "\n -t Prepend base directory name to TEMPLATE" //usage: "\n -p DIR Use DIR as a base directory (implies -t)" //usage: "\n -u Do not create anything; print a name" @@ -71,7 +71,6 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv) if (!path || path[0] == '\0') path = "/tmp"; - /* -q is ignored */ opt_complementary = "?1"; /* 1 argument max */ opts = getopt32(argv, "dqtp:u", &path); @@ -83,33 +82,32 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv) chp = xstrdup("tmp.XXXXXX"); opts |= OPT_t; } - - if (opts & OPT_u) { - /* Remove (up to) 6 X's */ - unsigned len = strlen(chp); - int cnt = len > 6 ? 6 : len; - while (--cnt >= 0 && chp[--len] == 'X') - chp[len] = '\0'; - - chp = tempnam(opts & (OPT_t|OPT_p) ? path : "./", chp); - if (!chp) - return EXIT_FAILURE; - if (!(opts & (OPT_t|OPT_p))) - chp += 2; - goto ret; +#if 0 + /* Don't allow directory separator in template */ + if ((opts & OPT_t) && bb_basename(chp) != chp) { + errno = EINVAL; + goto error; } - +#endif if (opts & (OPT_t|OPT_p)) chp = concat_path_file(path, chp); - if (opts & OPT_d) { + if (opts & OPT_u) { + chp = mktemp(chp); + if (chp[0] == '\0') + goto error; + } else if (opts & OPT_d) { if (mkdtemp(chp) == NULL) - return EXIT_FAILURE; + goto error; } else { if (mkstemp(chp) < 0) - return EXIT_FAILURE; + goto error; } - ret: puts(chp); return EXIT_SUCCESS; + error: + if (opts & OPT_q) + return EXIT_FAILURE; + /* don't use chp as it gets mangled in case of error */ + bb_perror_nomsg_and_die(); } |