about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-08-02 00:48:48 -0400
committerRich Felker <dalias@aerifal.cx>2013-08-02 00:48:48 -0400
commitc4685ae429a0cce4b285859d62a71fe603f0a864 (patch)
tree7f6ea3b81689b5d4d96b61df8894c7352d13f572
parent926272ddffa293ee68ffeb01422fc8c792acf428 (diff)
downloadmusl-c4685ae429a0cce4b285859d62a71fe603f0a864.tar.gz
musl-c4685ae429a0cce4b285859d62a71fe603f0a864.tar.xz
musl-c4685ae429a0cce4b285859d62a71fe603f0a864.zip
make mkdtemp and mkstemp family leave template unchanged on fail
also refactor mkdtemp based on new shared temp code, removing
dependency on the deprecated mktemp, whose behavior made this logic
more difficult.
-rw-r--r--src/temp/mkdtemp.c24
-rw-r--r--src/temp/mkostemps.c7
2 files changed, 18 insertions, 13 deletions
diff --git a/src/temp/mkdtemp.c b/src/temp/mkdtemp.c
index 76140c77..195e9cba 100644
--- a/src/temp/mkdtemp.c
+++ b/src/temp/mkdtemp.c
@@ -8,19 +8,23 @@
 #include <sys/stat.h>
 #include "libc.h"
 
-char *__mktemp(char *);
+char *__randname(char *);
 
 char *mkdtemp(char *template)
 {
-	int retries = 100, t0 = *template;
-	while (retries--) {
-		if (!*__mktemp(template)) return 0;
-		if (!mkdir(template, 0700)) return template;
-		if (errno != EEXIST) return 0;
-		/* this is safe because mktemp verified
-		 * that we have a valid template string */
-		template[0] = t0;
-		strcpy(template+strlen(template)-6, "XXXXXX");
+	size_t l = strlen(template);
+	int retries = 100;
+
+	if (l<6 || memcmp(template+l-6, "XXXXXX", 6)) {
+		errno = EINVAL;
+		return 0;
 	}
+
+	do {
+		__randname(template+l-6);
+		if (!mkdir(template, 0700)) return template;
+	} while (--retries && errno == EEXIST);
+
+	memcpy(template+l-6, "XXXXXX", 6);
 	return 0;
 }
diff --git a/src/temp/mkostemps.c b/src/temp/mkostemps.c
index 8cc01e37..7f8492a1 100644
--- a/src/temp/mkostemps.c
+++ b/src/temp/mkostemps.c
@@ -16,12 +16,13 @@ int __mkostemps(char *template, int len, int flags)
 	}
 
 	int fd, retries = 100;
-	while (retries--) {
+	do {
 		__randname(template+l-len-6);
 		if ((fd = open(template, flags | O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
 			return fd;
-		if (errno != EEXIST) return -1;
-	}
+	} while (--retries && errno == EEXIST);
+
+	memcpy(template+l-len-6, "XXXXXX", 6);
 	return -1;
 }