[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-gnulib] tempname.c patch from libc
From: |
Bruno Haible |
Subject: |
Re: [bug-gnulib] tempname.c patch from libc |
Date: |
Wed, 20 Sep 2006 22:16:36 +0200 |
User-agent: |
KMail/1.9.1 |
> Import this patch from libc:
>
> 2006-04-07 Ulrich Drepper <address@hidden>
>
> * 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 <address@hidden>
* mkdtemp.c: Import from libc.
2006-04-07 Ulrich Drepper <address@hidden>
* 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 <address@hidden>
* 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;