git: b22fdf45ff8e - main - libc: try to skip memcpy in _gettemp

Mateusz Guzik mjg at FreeBSD.org
Sun Jan 24 11:06:57 UTC 2021


The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=b22fdf45ff8ef1d1f9a6c28f1d7f59ca4b012da6

commit b22fdf45ff8ef1d1f9a6c28f1d7f59ca4b012da6
Author:     Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-01-24 04:34:22 +0000
Commit:     Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-01-24 11:06:36 +0000

    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? */


More information about the dev-commits-src-all mailing list