cvsdist 67cda0
--- a2ps-4.13/lib/routines.c.security	Sat Oct 16 05:46:37 1999
cvsdist 67cda0
+++ a2ps-4.13/lib/routines.c	Mon Feb 12 17:45:15 2001
cvsdist 67cda0
@@ -242,3 +242,50 @@
cvsdist 67cda0
   /* Don't complain if you can't unlink.  Who cares of a tmp file? */
cvsdist 67cda0
   unlink (filename);
cvsdist 67cda0
 }
cvsdist 67cda0
+
cvsdist 67cda0
+/*
cvsdist 67cda0
+ * Securely generate a temp file, and make sure it gets
cvsdist 67cda0
+ * deleted upon exit.
cvsdist 67cda0
+ */
cvsdist 67cda0
+static char **	tempfiles;
cvsdist 67cda0
+static unsigned	ntempfiles;
cvsdist 67cda0
+
cvsdist 67cda0
+static void
cvsdist 67cda0
+cleanup_tempfiles()
cvsdist 67cda0
+{
cvsdist 67cda0
+	while (ntempfiles--)
cvsdist 67cda0
+		unlink(tempfiles[ntempfiles]);
cvsdist 67cda0
+}
cvsdist 67cda0
+
cvsdist 67cda0
+char *
cvsdist 67cda0
+safe_tempnam(const char *pfx)
cvsdist 67cda0
+{
cvsdist 67cda0
+	char	*dirname, *filename;
cvsdist 67cda0
+	int	fd;
cvsdist 67cda0
+
cvsdist 67cda0
+	if (!(dirname = getenv("TMPDIR")))
cvsdist 67cda0
+		dirname = "/tmp";
cvsdist 67cda0
+
cvsdist 67cda0
+	tempfiles = (char **) realloc(tempfiles,
cvsdist 67cda0
+			(ntempfiles+1) * sizeof(char *));
cvsdist 67cda0
+	if (tempfiles == NULL)
cvsdist 67cda0
+		return NULL;
cvsdist 67cda0
+
cvsdist 67cda0
+	filename = malloc(strlen(dirname) + strlen(pfx) + sizeof("/XXXXXX"));
cvsdist 67cda0
+	if (!filename)
cvsdist 67cda0
+		return NULL;
cvsdist 67cda0
+
cvsdist 67cda0
+	sprintf(filename, "%s/%sXXXXXX", dirname, pfx);
cvsdist 67cda0
+
cvsdist 67cda0
+	if ((fd = mkstemp(filename)) < 0) {
cvsdist 67cda0
+		free(filename);
cvsdist 67cda0
+		return NULL;
cvsdist 67cda0
+	}
cvsdist 67cda0
+	close(fd);
cvsdist 67cda0
+
cvsdist 67cda0
+	if (ntempfiles == 0)
cvsdist 67cda0
+		atexit(cleanup_tempfiles);
cvsdist 67cda0
+	tempfiles[ntempfiles++] = filename;
cvsdist 67cda0
+
cvsdist 67cda0
+	return filename;
cvsdist 67cda0
+}
cvsdist 67cda0
--- a2ps-4.13/lib/routines.h.security	Mon Oct 18 21:24:41 1999
cvsdist 67cda0
+++ a2ps-4.13/lib/routines.h	Mon Feb 12 17:39:30 2001
cvsdist 67cda0
@@ -255,7 +255,8 @@
cvsdist 67cda0
 /* If _STR_ is not defined, give it a tempname in _TMPDIR_ */
cvsdist 67cda0
 #define tempname_ensure(Str)				\
cvsdist 67cda0
 do {							\
cvsdist 67cda0
-  (Str) = (Str) ? (Str) : tempnam (NULL, "a2_");	\
cvsdist 67cda0
+  (Str) = (Str) ? (Str) : safe_tempnam("a2_");	\
cvsdist 67cda0
 } while (0)
cvsdist 67cda0
+char * safe_tempnam(const char *);
cvsdist 67cda0
 
cvsdist 67cda0
 #endif