diff options
author | Rich Felker <dalias@aerifal.cx> | 2013-08-02 00:48:48 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2013-08-02 00:48:48 -0400 |
commit | c4685ae429a0cce4b285859d62a71fe603f0a864 (patch) | |
tree | 7f6ea3b81689b5d4d96b61df8894c7352d13f572 /src/temp/mkdtemp.c | |
parent | 926272ddffa293ee68ffeb01422fc8c792acf428 (diff) | |
download | musl-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.
Diffstat (limited to 'src/temp/mkdtemp.c')
-rw-r--r-- | src/temp/mkdtemp.c | 24 |
1 files changed, 14 insertions, 10 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; } |