From c4685ae429a0cce4b285859d62a71fe603f0a864 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 2 Aug 2013 00:48:48 -0400 Subject: 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. --- src/temp/mkdtemp.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'src/temp/mkdtemp.c') 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 #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; } -- cgit v1.2.1