From 8d24932c8061881e94d584601b422d8df47df1b4 Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Wed, 14 Jul 2010 15:18:50 +0000 Subject: [PATCH] lib: don't give back the same temporary filenames even if removed. workaround for what seems to be a clang/llvm bug/assumption. --- lib/libc/stdio/mktemp.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/libc/stdio/mktemp.c b/lib/libc/stdio/mktemp.c index 4cd712163..e63a47b30 100644 --- a/lib/libc/stdio/mktemp.c +++ b/lib/libc/stdio/mktemp.c @@ -71,6 +71,8 @@ _gettemp(path, doopen) register char *start, *trv; struct stat sbuf; u_int pid; + static int lastnames = 0; + int names = 0; pid = getpid(); for (trv = path; *trv; ++trv); /* extra X's get set to 0's */ @@ -100,16 +102,6 @@ _gettemp(path, doopen) } for (;;) { - if (doopen) { - if ((*doopen = - open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) - return(1); - if (errno != EEXIST) - return(0); - } - else if (stat(path, &sbuf)) - return(errno == ENOENT ? 1 : 0); - /* tricky little algorithm for backward compatibility */ for (trv = start;;) { if (!*trv) @@ -124,6 +116,27 @@ _gettemp(path, doopen) break; } } + + names++; + + if(names <= lastnames) + continue; + + lastnames = names; + + if (doopen) { + if ((*doopen = + open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) { + return(1); + } + if (errno != EEXIST) { + return(0); + } + } + else if (stat(path, &sbuf)) { + return(errno == ENOENT ? 1 : 0); + } + } /*NOTREACHED*/ } -- 2.44.0