Blame a2ps-4.13-security.patch

Bernhard M. Wiedemann 7eefe3
--- lib/routines.c
Bernhard M. Wiedemann 7eefe3
+++ lib/routines.c	Fri Jan  5 12:51:20 2001
Bernhard M. Wiedemann 7eefe3
@@ -242,3 +242,50 @@
Bernhard M. Wiedemann 7eefe3
   /* Don't complain if you can't unlink.  Who cares of a tmp file? */
Bernhard M. Wiedemann 7eefe3
   unlink (filename);
Bernhard M. Wiedemann 7eefe3
 }
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+/*
Bernhard M. Wiedemann 7eefe3
+ * Securely generate a temp file, and make sure it gets
Bernhard M. Wiedemann 7eefe3
+ * deleted upon exit.
Bernhard M. Wiedemann 7eefe3
+ */
Bernhard M. Wiedemann 7eefe3
+static char **	tempfiles;
Bernhard M. Wiedemann 7eefe3
+static unsigned	ntempfiles;
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+static void
Bernhard M. Wiedemann 7eefe3
+cleanup_tempfiles()
Bernhard M. Wiedemann 7eefe3
+{
Bernhard M. Wiedemann 7eefe3
+	while (ntempfiles--)
Bernhard M. Wiedemann 7eefe3
+		unlink(tempfiles[ntempfiles]);
Bernhard M. Wiedemann 7eefe3
+}
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+char *
Bernhard M. Wiedemann 7eefe3
+safe_tempnam(const char *pfx)
Bernhard M. Wiedemann 7eefe3
+{
Bernhard M. Wiedemann 7eefe3
+	char	*dirname, *filename;
Bernhard M. Wiedemann 7eefe3
+	int	fd;
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	if (!(dirname = getenv("TMPDIR")))
Bernhard M. Wiedemann 7eefe3
+		dirname = "/tmp";
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	tempfiles = (char **) realloc(tempfiles,
Bernhard M. Wiedemann 7eefe3
+			(ntempfiles+1) * sizeof(char *));
Bernhard M. Wiedemann 7eefe3
+	if (tempfiles == NULL)
Bernhard M. Wiedemann 7eefe3
+		return NULL;
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	filename = malloc(strlen(dirname) + strlen(pfx) + sizeof("/XXXXXX"));
Bernhard M. Wiedemann 7eefe3
+	if (!filename)
Bernhard M. Wiedemann 7eefe3
+		return NULL;
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	sprintf(filename, "%s/%sXXXXXX", dirname, pfx);
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	if ((fd = mkstemp(filename)) < 0) {
Bernhard M. Wiedemann 7eefe3
+		free(filename);
Bernhard M. Wiedemann 7eefe3
+		return NULL;
Bernhard M. Wiedemann 7eefe3
+	}
Bernhard M. Wiedemann 7eefe3
+	close(fd);
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	if (ntempfiles == 0)
Bernhard M. Wiedemann 7eefe3
+		atexit(cleanup_tempfiles);
Bernhard M. Wiedemann 7eefe3
+	tempfiles[ntempfiles++] = filename;
Bernhard M. Wiedemann 7eefe3
+
Bernhard M. Wiedemann 7eefe3
+	return filename;
Bernhard M. Wiedemann 7eefe3
+}
Bernhard M. Wiedemann 7eefe3
--- lib/routines.h
Bernhard M. Wiedemann 7eefe3
+++ lib/routines.h	Fri Jan  5 12:37:53 2001
Bernhard M. Wiedemann 7eefe3
@@ -255,7 +255,8 @@
Bernhard M. Wiedemann 7eefe3
 /* If _STR_ is not defined, give it a tempname in _TMPDIR_ */
Bernhard M. Wiedemann 7eefe3
 #define tempname_ensure(Str)				\
Bernhard M. Wiedemann 7eefe3
 do {							\
Bernhard M. Wiedemann 7eefe3
-  (Str) = (Str) ? (Str) : tempnam (NULL, "a2_");	\
Bernhard M. Wiedemann 7eefe3
+  (Str) = (Str) ? (Str) : safe_tempnam("a2_");	\
Bernhard M. Wiedemann 7eefe3
 } while (0)
Bernhard M. Wiedemann 7eefe3
+char * safe_tempnam(const char *);
Bernhard M. Wiedemann 7eefe3
 
Bernhard M. Wiedemann 7eefe3
 #endif