[git commit] mktemp: fix mktemp -u temp.XXXXXX returning garbage when TMPDIR is set

Denys Vlasenko vda.linux at googlemail.com
Mon Oct 8 09:47:22 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=eab343e7e1e5331df833aa69f14584e4a6c738f1
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at tiscali.it>
Signed-off-by: Ron Yorston <rmy at tigress.co.uk>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 debianutils/mktemp.c |   40 +++++++++++++++++++---------------------
 1 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/debianutils/mktemp.c b/debianutils/mktemp.c
index dbe4309..983d7a2 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();
 }


More information about the busybox-cvs mailing list