tempnam.c.patch   [plain text]


--- tempnam.c.orig	2010-10-25 19:45:24.000000000 -0700
+++ tempnam.c	2010-10-25 22:01:51.000000000 -0700
@@ -53,35 +53,60 @@ 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;
 	(void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
-	if ((f = _mktemp(name)))
+	if ((f = _mktemp(name))) {
 		return(f);
+	}
 
 	sverrno = errno;
 	free(name);