> Import this patch from libc: > > 2006-04-07 Ulrich Drepper <[EMAIL PROTECTED]> > > * lib/tempname.c (__gen_tempname): Change attempts_min > into a macro. Use preprocessor to decide how to initialize > attempts [Coverity CID 67].
And I'm doing likewise for mkdtemp.c: 2006-09-20 Bruno Haible <[EMAIL PROTECTED]> * mkdtemp.c: Import from libc. 2006-04-07 Ulrich Drepper <[EMAIL PROTECTED]> * sysdeps/posix/tempname.c (__gen_tempname): Change attempts_min into a macro. Use preprocessor to decide how to initialize attempts [Coverity CID 67]. 2001-11-27 Paul Eggert <[EMAIL PROTECTED]> * sysdeps/posix/tempname.c (__gen_tempname): Try at least ATTEMPTS_MIN or TMP_MAX times, whichever is greater. *** mkdtemp.c 14 Sep 2006 14:18:36 -0000 1.11 --- mkdtemp.c 20 Sep 2006 20:15:26 -0000 *************** *** 114,122 **** char *XXXXXX; static uint64_t value; uint64_t random_time_bits; ! int count, fd = -1; int save_errno = errno; len = strlen (tmpl); if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) { --- 114,139 ---- char *XXXXXX; static uint64_t value; uint64_t random_time_bits; ! unsigned int count; ! int fd = -1; int save_errno = errno; + /* A lower bound on the number of temporary files to attempt to + generate. The maximum total number of temporary file names that + can exist for a given template is 62**6. It should never be + necessary to try all these combinations. Instead if a reasonable + number of names is tried (we define reasonable as 62**3) fail to + give the system administrator the chance to remove the problems. */ + #define ATTEMPTS_MIN (62 * 62 * 62) + + /* The number of times to attempt to generate a temporary file. To + conform to POSIX, this must be no smaller than TMP_MAX. */ + #if ATTEMPTS_MIN < TMP_MAX + unsigned int attempts = TMP_MAX; + #else + unsigned int attempts = ATTEMPTS_MIN; + #endif + len = strlen (tmpl); if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) { *************** *** 143,149 **** #endif value += random_time_bits ^ __getpid (); ! for (count = 0; count < TMP_MAX; value += 7777, ++count) { uint64_t v = value; --- 160,166 ---- #endif value += random_time_bits ^ __getpid (); ! for (count = 0; count < attempts; value += 7777, ++count) { uint64_t v = value;