aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-01-24 04:34:22 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-02-01 12:39:15 +0000
commit3eae6412b50bbcfe1a7affc26202dc896aedd1ab (patch)
treebdfbea58d15afdba7bf578688da7a99164a37de2
parent410994f463351fe2899af77c797dd61c772b02cf (diff)
downloadsrc-3eae6412b50bbcfe1a7affc26202dc896aedd1ab.tar.gz
src-3eae6412b50bbcfe1a7affc26202dc896aedd1ab.zip
libc: try to skip memcpy in _gettemp
(cherry picked from commit b22fdf45ff8ef1d1f9a6c28f1d7f59ca4b012da6)
-rw-r--r--lib/libc/stdio/mktemp.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/libc/stdio/mktemp.c b/lib/libc/stdio/mktemp.c
index c47e0221e5cd..0ede3058a3d5 100644
--- a/lib/libc/stdio/mktemp.c
+++ b/lib/libc/stdio/mktemp.c
@@ -123,6 +123,7 @@ _gettemp(int dfd, char *path, int *doopen, int domkdir, int slen, int oflags)
struct stat sbuf;
uint32_t rand;
char carrybuf[MAXPATHLEN];
+ int saved;
if ((doopen != NULL && domkdir) || slen < 0 ||
(oflags & ~(O_APPEND | O_DIRECT | O_SHLOCK | O_EXLOCK | O_SYNC |
@@ -151,9 +152,7 @@ _gettemp(int dfd, char *path, int *doopen, int domkdir, int slen, int oflags)
}
start = trv + 1;
- /* save first combination of random characters */
- memcpy(carrybuf, start, suffp - start);
-
+ saved = 0;
oflags |= O_CREAT | O_EXCL | O_RDWR;
for (;;) {
if (doopen) {
@@ -170,6 +169,12 @@ _gettemp(int dfd, char *path, int *doopen, int domkdir, int slen, int oflags)
} else if (lstat(path, &sbuf))
return (errno == ENOENT);
+ /* save first combination of random characters */
+ if (!saved) {
+ memcpy(carrybuf, start, suffp - start);
+ saved = 1;
+ }
+
/* If we have a collision, cycle through the space of filenames */
for (trv = start, carryp = carrybuf;;) {
/* have we tried all possible permutations? */