Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > by-pkgid > d50813aed9bd92016a37321e63afe40f > files > 1

rcs-5.7-14mdv2010.1.src.rpm

--- rcs-5.7/src/rcsfnms.c.security	Fri Jun 16 08:19:24 1995
+++ rcs-5.7/src/rcsfnms.c	Fri Jan  5 10:00:21 2001
@@ -258,19 +258,57 @@
 };
 
 #if has_mktemp
+static char	tmppath[1024];
+
+	static void
+tmpcleanup()
+{
+	/* For now, assume that all temp files get
+	 * removed before we are invoked */
+	rmdir(tmppath);
+}
+
 	static char const *tmp P((void));
 	static char const *
 tmp()
 /* Yield the name of the tmp directory.  */
 {
-	static char const *s;
-	if (!s
-		&&  !(s = cgetenv("TMPDIR"))	/* Unix tradition */
+	const char	*s;
+
+	if (tmppath[0])
+		return tmppath;
+
+	if (!(s = cgetenv("TMPDIR"))		/* Unix tradition */
 		&&  !(s = cgetenv("TMP"))	/* DOS tradition */
 		&&  !(s = cgetenv("TEMP"))	/* another DOS tradition */
 	)
 		s = TMPDIR;
-	return s;
+
+	if (strlen(s) > sizeof(tmppath) - 11)
+		s = TMPDIR;
+
+#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 2)
+	snprintf(tmppath, sizeof(tmppath), "%s/rcsXXXXXX", s);
+	if (!mkdtemp(tmppath) || !tmppath[0])
+		goto failed;
+#else
+	while (1) {
+		snprintf(tmppath, sizeof(tmppath), "%s/rcsXXXXXX", s);
+		if (!mktemp(tmppath) || !tmppath[0])
+			goto failed;
+		if (mkdir(tmppath, 0700) >= 0)
+			break;
+		if (errno != EEXIST)
+			goto failed;
+	}
+#endif
+
+	atexit(tmpcleanup);
+	return tmppath;
+
+failed:
+	perror("Unable to create temp directory");
+	exit(123);
 }
 #endif