]>
Commit | Line | Data |
---|---|---|
9d216bc5 | 1 | diff -ur a2ps-4.13.orig/lib/routines.c a2ps-4.13/lib/routines.c\r |
2 | --- a2ps-4.13.orig/lib/routines.c Sat Oct 16 06:46:37 1999\r | |
3 | +++ a2ps-4.13/lib/routines.c Fri Jan 5 12:51:20 2001\r | |
4 | @@ -242,3 +242,50 @@\r | |
5 | /* Don't complain if you can't unlink. Who cares of a tmp file? */\r | |
6 | unlink (filename);\r | |
7 | }\r | |
8 | +\r | |
9 | +/*\r | |
10 | + * Securely generate a temp file, and make sure it gets\r | |
11 | + * deleted upon exit.\r | |
12 | + */\r | |
13 | +static char ** tempfiles;\r | |
14 | +static unsigned ntempfiles;\r | |
15 | +\r | |
16 | +static void\r | |
17 | +cleanup_tempfiles()\r | |
18 | +{\r | |
19 | + while (ntempfiles--)\r | |
20 | + unlink(tempfiles[ntempfiles]);\r | |
21 | +}\r | |
22 | +\r | |
23 | +char *\r | |
24 | +safe_tempnam(const char *pfx)\r | |
25 | +{\r | |
26 | + char *dirname, *filename;\r | |
27 | + int fd;\r | |
28 | +\r | |
29 | + if (!(dirname = getenv("TMPDIR")))\r | |
30 | + dirname = "/tmp";\r | |
31 | +\r | |
32 | + tempfiles = (char **) realloc(tempfiles,\r | |
33 | + (ntempfiles+1) * sizeof(char *));\r | |
34 | + if (tempfiles == NULL)\r | |
35 | + return NULL;\r | |
36 | +\r | |
37 | + filename = malloc(strlen(dirname) + strlen(pfx) + sizeof("/XXXXXX"));\r | |
38 | + if (!filename)\r | |
39 | + return NULL;\r | |
40 | +\r | |
41 | + sprintf(filename, "%s/%sXXXXXX", dirname, filename);\r | |
42 | +\r | |
43 | + if ((fd = mkstemp(filename)) < 0) {\r | |
44 | + free(filename);\r | |
45 | + return NULL;\r | |
46 | + }\r | |
47 | + close(fd);\r | |
48 | +\r | |
49 | + if (ntempfiles == 0)\r | |
50 | + atexit(cleanup_tempfiles);\r | |
51 | + tempfiles[ntempfiles++] = filename;\r | |
52 | +\r | |
53 | + return filename;\r | |
54 | +}\r | |
55 | diff -ur a2ps-4.13.orig/lib/routines.h a2ps-4.13/lib/routines.h\r | |
56 | --- a2ps-4.13.orig/lib/routines.h Mon Oct 18 22:24:41 1999\r | |
57 | +++ a2ps-4.13/lib/routines.h Fri Jan 5 12:37:53 2001\r | |
58 | @@ -255,7 +255,8 @@\r | |
59 | /* If _STR_ is not defined, give it a tempname in _TMPDIR_ */\r | |
60 | #define tempname_ensure(Str) \\r | |
61 | do { \\r | |
62 | - (Str) = (Str) ? (Str) : tempnam (NULL, "a2_"); \\r | |
63 | + (Str) = (Str) ? (Str) : safe_tempnam("a2_"); \\r | |
64 | } while (0)\r | |
65 | +char * safe_tempnam(const char *);\r | |
66 | \r | |
67 | #endif\r |