Loading...
stdio/FreeBSD/mktemp.c.patch Libc-498 Libc-763.13
--- Libc/Libc-498/stdio/FreeBSD/mktemp.c.patch
+++ Libc/Libc-763.13/stdio/FreeBSD/mktemp.c.patch
@@ -1,79 +1,11 @@
---- mktemp.c.orig	Tue Mar 30 22:56:07 2004
-+++ mktemp.c	Tue Mar 30 23:39:22 2004
-@@ -40,6 +40,7 @@
- #include "namespace.h"
- #include <sys/types.h>
- #include <sys/stat.h>
-+#include <sys/syslimits.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <stdio.h>
-@@ -106,13 +107,14 @@
- 	int domkdir;
- 	int slen;
- {
--	char *start, *trv, *suffp;
-+	char *start, *trv, *suffp, *carryp;
- 	char *pad;
- 	struct stat sbuf;
- 	int rval;
- 	uint32_t rand;
-+	char carrybuf[NAME_MAX];
+--- mktemp.c.orig	2010-04-08 10:37:06.000000000 -0700
++++ mktemp.c	2010-04-08 10:40:05.000000000 -0700
+@@ -130,7 +130,7 @@ _gettemp(path, doopen, domkdir, slen)
  
--	if (doopen != NULL && domkdir) {
-+	if ((doopen != NULL && domkdir) || slen < 0) {
- 		errno = EINVAL;
- 		return (0);
- 	}
-@@ -122,7 +124,7 @@
- 	trv -= slen;
- 	suffp = trv;
- 	--trv;
--	if (trv < path) {
-+	if (trv < path || NULL != strchr(suffp, '/')) {
- 		errno = EINVAL;
- 		return (0);
- 	}
-@@ -134,6 +136,9 @@
+ 	/* Fill space with random characters */
+ 	while (trv >= path && *trv == 'X') {
+-		rand = arc4random_uniform(sizeof(padchar) - 1);
++		rand = arc4random() % (sizeof(padchar) - 1);
+ 		*trv-- = padchar[rand];
  	}
  	start = trv + 1;
- 
-+	/* save first combination of random characters */
-+	memcpy(carrybuf, start, suffp - start);
-+
- 	/*
- 	 * check the target directory.
- 	 */
-@@ -170,14 +175,25 @@
- 			return (errno == ENOENT);
- 
- 		/* If we have a collision, cycle through the space of filenames */
--		for (trv = start;;) {
--			if (*trv == '\0' || trv == suffp)
--				return (0);
-+		for (trv = start, carryp = carrybuf;;) {
-+			/* have we tried all possible permutations? */
-+			if (trv == suffp)
-+				return (0); /* yes - exit with EEXIST */
- 			pad = strchr(padchar, *trv);
--			if (pad == NULL || *++pad == '\0')
--				*trv++ = padchar[0];
--			else {
--				*trv++ = *pad;
-+			if (pad == NULL) {
-+				/* this should never happen */
-+				errno = EIO;
-+				return (0);
-+			}
-+			/* increment character */
-+			*trv = (*++pad == '\0') ? padchar[0] : *pad;
-+			/* carry to next position? */
-+			if (*trv == *carryp) {
-+				/* increment position and loop */
-+				++trv;
-+				++carryp;
-+			} else {
-+				/* try with new name */
- 				break;
- 			}
- 		}