Author: randy
Date: 2006-04-12 07:03:21 -0600 (Wed, 12 Apr 2006)
New Revision: 1476
Added:
trunk/enscript/
trunk/enscript/enscript-1.6.4-security_fixes-1.patch
Log:
Added Enscript security vulnerabilities patch
Added: trunk/enscript/enscript-1.6.4-security_fixes-1.patch
===================================================================
--- trunk/enscript/enscript-1.6.4-security_fixes-1.patch
(rev 0)
+++ trunk/enscript/enscript-1.6.4-security_fixes-1.patch 2006-04-12
13:03:21 UTC (rev 1476)
@@ -0,0 +1,187 @@
+Submitted By: Alexander E. Patrakov
<alexander_at_linuxfromscratch_dot_org>
+Date: 2006-04-12
+Initial Package Version: 1.6.4
+Upstream Status: Unknown
+Origin: Debian, the descriptions of the vulnerabilities can be
+ retrieved from
+ http://wiki.linuxfromscratch.org/blfs/wiki/Enscript
+ rediffed by Randy McMurchy
+Description: See Origin; fixes CAN-2004-1184, CAN-2004-1185 and
+ CAN-2004-1186
+
+
+diff -Naur enscript-1.6.4-orig/src/gsint.h enscript-1.6.4/src/gsint.h
+--- enscript-1.6.4-orig/src/gsint.h 2003-03-05 07:37:06.000000000 +0000
++++ enscript-1.6.4/src/gsint.h 2006-04-12 11:11:33.000000000 +0000
+@@ -701,4 +701,9 @@
+ */
+ void printer_close ___P ((void *context));
+
++/*
++ * Escape filenames for shell usage
++ */
++char *shell_escape ___P ((const char *fn));
++
+ #endif /* not GSINT_H */
+
+diff -Naur enscript-1.6.4-orig/src/main.c enscript-1.6.4/src/main.c
+--- enscript-1.6.4-orig/src/main.c 2003-03-05 07:36:32.000000000 +0000
++++ enscript-1.6.4/src/main.c 2006-04-12 11:11:33.000000000 +0000
+@@ -1546,9 +1546,13 @@
+ buffer_append (&cmd, intbuf);
+ buffer_append (&cmd, " ");
+
+- buffer_append (&cmd, "-Ddocument_title=\"");
+- buffer_append (&cmd, title);
+- buffer_append (&cmd, "\" ");
++ buffer_append (&cmd, "-Ddocument_title=\'");
++ if ((cp = shell_escape (title)) != NULL)
++ {
++ buffer_append (&cmd, cp);
++ free (cp);
++ }
++ buffer_append (&cmd, "\' ");
+
+ buffer_append (&cmd, "-Dtoc=");
+ buffer_append (&cmd, toc ? "1" : "0");
+@@ -1565,8 +1569,14 @@
+ /* Append input files. */
+ for (i = optind; i < argc; i++)
+ {
+- buffer_append (&cmd, " ");
+- buffer_append (&cmd, argv[i]);
++ char *cp;
++ if ((cp = shell_escape (argv[i])) != NULL)
++ {
++ buffer_append (&cmd, " \'");
++ buffer_append (&cmd, cp);
++ buffer_append (&cmd, "\'");
++ free (cp);
++ }
+ }
+
+ /* And do the job. */
+@@ -1627,7 +1637,7 @@
+ buffer_ptr (opts), buffer_len (opts));
+ }
+
+- buffer_append (&buffer, " \"%s\"");
++ buffer_append (&buffer, " \'%s\'");
+
+ input_filter = buffer_copy (&buffer);
+ input_filter_stdin = "-";
+
+diff -Naur enscript-1.6.4-orig/src/psgen.c enscript-1.6.4/src/psgen.c
+--- enscript-1.6.4-orig/src/psgen.c 2003-03-05 07:36:53.000000000 +0000
++++ enscript-1.6.4/src/psgen.c 2006-04-12 11:11:33.000000000 +0000
+@@ -2034,8 +2034,9 @@
+ else
+ {
+ ftail++;
+- strncpy (buf, fname, ftail - fname);
+- buf[ftail - fname] = '\0';
++ i = ftail - fname >= sizeof (buf)-1 ? sizeof (buf)-1 : ftail - fname;
++ strncpy (buf, fname, i);
++ buf[i] = '\0';
+ }
+
+ if (nup > 1)
+@@ -2385,9 +2386,10 @@
+ MESSAGE (2, (stderr, "[EMAIL PROTECTED]"%s\"\n", token->u.epsf.filename));
+
+ i = strlen (token->u.epsf.filename);
++ /*
+ if (i > 0 && token->u.epsf.filename[i - 1] == '|')
+ {
+- /* Read EPS data from pipe. */
++ / * Read EPS data from pipe. * /
+ token->u.epsf.pipe = 1;
+ token->u.epsf.filename[i - 1] = '\0';
+ token->u.epsf.fp = popen (token->u.epsf.filename, "r");
+@@ -2400,6 +2402,7 @@
+ }
+ }
+ else
++ */
+ {
+ char *filename;
+
+diff -Naur enscript-1.6.4-orig/src/util.c enscript-1.6.4/src/util.c
+--- enscript-1.6.4-orig/src/util.c 2003-03-05 07:26:32.000000000 +0000
++++ enscript-1.6.4/src/util.c 2006-04-12 11:11:33.000000000 +0000
+@@ -1239,6 +1239,8 @@
+
+ /* Create result. */
+ cp = xmalloc (len + 1);
++ if (cp == NULL)
++ return NULL;
+ for (i = 0, j = 0; string[i]; i++)
+ switch (string[i])
+ {
+@@ -1879,6 +1881,7 @@
+ char *cmd = NULL;
+ int cmdlen;
+ int i, pos;
++ char *cp;
+
+ is->is_pipe = 1;
+
+@@ -1902,12 +1905,16 @@
+ {
+ case 's':
+ /* Expand cmd-buffer. */
+- cmdlen += strlen (fname);
+- cmd = xrealloc (cmd, cmdlen);
++ if ((cp = shell_escape (fname)) != NULL)
++ {
++ cmdlen += strlen (cp);
++ cmd = xrealloc (cmd, cmdlen);
+
+- /* Paste filename. */
+- strcpy (cmd + pos, fname);
+- pos += strlen (fname);
++ /* Paste filename. */
++ strcpy (cmd + pos, cp);
++ pos += strlen (cp);
++ free (cp);
++ }
+
+ i++;
+ break;
+@@ -2116,3 +2123,36 @@
+ {
+ return buffer->len;
+ }
++
++/*
++ * Escapes the name of a file so that the shell groks it in 'single'
++ * quotation marks. The resulting pointer has to be free()ed when not
++ * longer used.
++*/
++char *
++shell_escape(const char *fn)
++{
++ size_t len = 0;
++ const char *inp;
++ char *retval, *outp;
++
++ for(inp = fn; *inp; ++inp)
++ switch(*inp)
++ {
++ case '\'': len += 4; break;
++ default: len += 1; break;
++ }
++
++ outp = retval = malloc(len + 1);
++ if(!outp)
++ return NULL; /* perhaps one should do better error handling here */
++ for(inp = fn; *inp; ++inp)
++ switch(*inp)
++ {
++ case '\'': *outp++ = '\''; *outp++ = '\\'; *outp++ = '\'', *outp++ =
'\''; break;
++ default: *outp++ = *inp; break;
++ }
++ *outp = 0;
++
++ return retval;
++}
--
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page