From: Rich Felker Date: Fri, 2 Aug 2013 05:06:53 +0000 (-0400) Subject: fix (deprecated) mktemp logic and update it to match other temp functions X-Git-Tag: v0.9.13~105 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=38f44d692310dd669ad9ee13a2993c91e81d2721;p=oweals%2Fmusl.git fix (deprecated) mktemp logic and update it to match other temp functions the access function cannot be used to check for existence, because it operates using real uid/gid rather than effective to determine accessibility; this matters for the non-final path components. instead, use stat. failure of stat is success if only the final component is missing (ENOENT) and otherwise is failure. --- diff --git a/src/temp/mktemp.c b/src/temp/mktemp.c index a1c89a6c..67130e16 100644 --- a/src/temp/mktemp.c +++ b/src/temp/mktemp.c @@ -2,23 +2,30 @@ #include #include #include +#include char *__randname(char *); char *mktemp(char *template) { size_t l = strlen(template); - int retries = 10000; + int retries = 100; + struct stat st; if (l < 6 || memcmp(template+l-6, "XXXXXX", 6)) { errno = EINVAL; *template = 0; return template; } - while (retries--) { + + do { __randname(template+l-6); - if (access(template, F_OK) < 0) return template; - } + if (stat(template, &st)) { + if (errno != ENOENT) *template = 0; + return template; + } + } while (--retries); + *template = 0; errno = EEXIST; return template;