瀏覽代碼

make mktemp match the historic behavior, and update functions that use it

the historic mktemp is supposed to blank the template string on
failure, rather than returning 0. just zero the first character so
that mkstemp and mkdtemp can still retry with O(1) space requirement.
Rich Felker 14 年之前
父節點
當前提交
69ecbd0f31
共有 3 個文件被更改,包括 8 次插入5 次删除
  1. 3 2
      src/temp/mkdtemp.c
  2. 3 2
      src/temp/mkstemp.c
  3. 2 1
      src/temp/mktemp.c

+ 3 - 2
src/temp/mkdtemp.c

@@ -12,13 +12,14 @@ char *__mktemp(char *);
 
 char *mkdtemp(char *template)
 {
-	int retries = 100;
+	int retries = 100, t0 = *template;
 	while (retries--) {
-		if (!__mktemp(template)) return 0;
+		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");
 	}
 	return 0;

+ 3 - 2
src/temp/mkstemp.c

@@ -11,14 +11,15 @@ char *__mktemp(char *);
 
 int mkstemp(char *template)
 {
-	int fd, retries = 100;
+	int fd, retries = 100, t0 = *template;
 	while (retries--) {
-		if (!__mktemp(template)) return -1;
+		if (!*__mktemp(template)) return -1;
 		if ((fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
 			return fd;
 		if (errno != EEXIST) return -1;
 		/* this is safe because mktemp verified
 		 * that we have a valid template string */
+		template[0] = t0;
 		strcpy(template+strlen(template)-6, "XXXXXX");
 	}
 	return -1;

+ 2 - 1
src/temp/mktemp.c

@@ -26,8 +26,9 @@ char *__mktemp(char *template)
 		if (access(template, F_OK) < 0) return template;
 		r = r * 1103515245 + 12345;
 	}
+	*template = 0;
 	errno = EEXIST;
-	return 0;
+	return template;
 }
 
 weak_alias(__mktemp, mktemp);