mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-23 06:32:05 +03:00
make mktemp match the historic behavior, and update functions that use it
the historic mktemp is supposed to blank the template string on failure, rather than returning 0. just zero the first character so that mkstemp and mkdtemp can still retry with O(1) space requirement.
This commit is contained in:
parent
2e6239dd06
commit
69ecbd0f31
@ -12,13 +12,14 @@ char *__mktemp(char *);
|
||||
|
||||
char *mkdtemp(char *template)
|
||||
{
|
||||
int retries = 100;
|
||||
int retries = 100, t0 = *template;
|
||||
while (retries--) {
|
||||
if (!__mktemp(template)) return 0;
|
||||
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");
|
||||
}
|
||||
return 0;
|
||||
|
@ -11,14 +11,15 @@ char *__mktemp(char *);
|
||||
|
||||
int mkstemp(char *template)
|
||||
{
|
||||
int fd, retries = 100;
|
||||
int fd, retries = 100, t0 = *template;
|
||||
while (retries--) {
|
||||
if (!__mktemp(template)) return -1;
|
||||
if (!*__mktemp(template)) return -1;
|
||||
if ((fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
|
||||
return fd;
|
||||
if (errno != EEXIST) return -1;
|
||||
/* this is safe because mktemp verified
|
||||
* that we have a valid template string */
|
||||
template[0] = t0;
|
||||
strcpy(template+strlen(template)-6, "XXXXXX");
|
||||
}
|
||||
return -1;
|
||||
|
@ -26,8 +26,9 @@ char *__mktemp(char *template)
|
||||
if (access(template, F_OK) < 0) return template;
|
||||
r = r * 1103515245 + 12345;
|
||||
}
|
||||
*template = 0;
|
||||
errno = EEXIST;
|
||||
return 0;
|
||||
return template;
|
||||
}
|
||||
|
||||
weak_alias(__mktemp, mktemp);
|
||||
|
Loading…
Reference in New Issue
Block a user