From b22fdf45ff8ef1d1f9a6c28f1d7f59ca4b012da6 Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Sun, 24 Jan 2021 05:34:22 +0100 Subject: [PATCH] libc: try to skip memcpy in _gettemp --- lib/libc/stdio/mktemp.c | 11 ++++++++--- 1 file 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? */