Loading...
stdio/FreeBSD/tempnam.c.patch /dev/null Libc-594.9.1
--- /dev/null
+++ Libc/Libc-594.9.1/stdio/FreeBSD/tempnam.c.patch
@@ -0,0 +1,77 @@
+--- tempnam.c.orig	2008-11-12 17:08:45.000000000 -0800
++++ tempnam.c	2008-11-12 17:41:23.000000000 -0800
+@@ -57,35 +57,68 @@ tempnam(dir, pfx)
+ 	int sverrno;
+ 	char *f, *name;
+ 
+-	if (!(name = malloc(MAXPATHLEN)))
++	if (!(name = malloc(MAXPATHLEN))) {
+ 		return(NULL);
++	}
+ 
+ 	if (!pfx)
+ 		pfx = "tmp.";
+ 
++#if !__DARWIN_UNIX03
+ 	if (issetugid() == 0 && (f = getenv("TMPDIR"))) {
+ 		(void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+ 		    *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+-		if ((f = _mktemp(name)))
++		if ((f = _mktemp(name))) {
+ 			return(f);
++		}
+ 	}
+-
++#endif /* !__DARWIN_UNIX03 */
+ 	if ((f = (char *)dir)) {
++#if __DARWIN_UNIX03
++	    if (access(dir, W_OK) == 0) {
++#endif /* __DARWIN_UNIX03 */
+ 		(void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+ 		    *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+-		if ((f = _mktemp(name)))
++		if ((f = _mktemp(name))) {
+ 			return(f);
++		}
++#if __DARWIN_UNIX03
++	    }
++#endif /* __DARWIN_UNIX03 */
+ 	}
+ 
+ 	f = P_tmpdir;
++#if __DARWIN_UNIX03
++	if (access(f, W_OK) == 0) {	/* directory accessible? */
++#endif /* __DARWIN_UNIX03 */
+ 	(void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+-	if ((f = _mktemp(name)))
++	if ((f = _mktemp(name))) {
+ 		return(f);
++	}
+ 
++#if __DARWIN_UNIX03
++	}
++	if (issetugid() == 0 && (f = getenv("TMPDIR")) && access(f, W_OK) == 0) {
++		(void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
++		    *(f + strlen(f) - 1) == '/'? "": "/", pfx);
++		if ((f = _mktemp(name))) {
++			return(f);
++		}
++	}
++#endif /* __DARWIN_UNIX03 */
+ 	f = _PATH_TMP;
++#if __DARWIN_UNIX03
++	if (access(f, W_OK) < 0) {	
++		f = "./";	/* directory inaccessible */
++		if (access(f, W_OK) < 0) {
++			return(NULL);
++		}
++	}
++#endif /* __DARWIN_UNIX03 */
+ 	(void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+-	if ((f = _mktemp(name)))
++	if ((f = _mktemp(name))) {
+ 		return(f);
++	}
+ 
+ 	sverrno = errno;
+ 	free(name);