make mktemp match the historic behavior, and update functions that use it
authorRich Felker <dalias@aerifal.cx>
Sat, 19 Feb 2011 14:40:07 +0000 (09:40 -0500)
committerRich Felker <dalias@aerifal.cx>
Sat, 19 Feb 2011 14:40:07 +0000 (09:40 -0500)
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.

src/temp/mkdtemp.c
src/temp/mkstemp.c
src/temp/mktemp.c

index f2ecc5102ed996a92bf2da6bfdaf1bcf9899fc47..76140c77591c781fe00d10b2075dff1a4098d169 100644 (file)
@@ -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;
index 20019ed93eeb81825900dd3e9aeba0764176a1f3..a390d4272cef638384973268ba149b99fbcf01ed 100644 (file)
@@ -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;
index 1462a16c6dd189ff8354656a924bfcc324ddc67b..1057651e315ccc8cefc55c454aa3e5c0682e588f 100644 (file)
@@ -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);