Add a fix for CAN-2005-3001, via pkgsrc from Ubunto.
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Sat, 11 Feb 2006 01:21:27 +0000 (01:21 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Sat, 11 Feb 2006 01:21:27 +0000 (01:21 +0000)
This is a very low impact problem, since the change of an index being
larger than 500 KB is almost zero and the code has problems either way.

gnu/usr.bin/texinfo/texindex/Makefile
gnu/usr.bin/texinfo/texindex/texindex.c.patch [new file with mode: 0644]

index 95c6a3d..705a923 100644 (file)
@@ -1,8 +1,11 @@
 # $FreeBSD: src/gnu/usr.bin/texinfo/texindex/Makefile,v 1.7.2.1 2002/08/07 16:53:39 ru Exp $
-# $DragonFly: src/gnu/usr.bin/texinfo/texindex/Makefile,v 1.2 2003/06/17 04:25:49 dillon Exp $
+# $DragonFly: src/gnu/usr.bin/texinfo/texindex/Makefile,v 1.3 2006/02/11 01:21:27 joerg Exp $
 
 PROG=  texindex
 
+PATCHES=       texindex.c.patch
+CONTRIBDIR=    ${TXIDIR}/util
+
 DPADD= ${LIBTXI}
 LDADD= ${LIBTXI}
 
diff --git a/gnu/usr.bin/texinfo/texindex/texindex.c.patch b/gnu/usr.bin/texinfo/texindex/texindex.c.patch
new file mode 100644 (file)
index 0000000..c52afed
--- /dev/null
@@ -0,0 +1,80 @@
+$DragonFly: src/gnu/usr.bin/texinfo/texindex/texindex.c.patch,v 1.1 2006/02/11 01:21:27 joerg Exp $
+Security fix for CAN-2005-3001.
+
+Index: texindex.c
+===================================================================
+RCS file: /cvs/src/contrib/texinfo-4/util/texindex.c,v
+retrieving revision 1.1
+diff -u -r1.1 texindex.c
+--- texindex.c 28 Aug 2005 12:23:25 -0000      1.1
++++ texindex.c 11 Feb 2006 01:11:08 -0000
+@@ -387,14 +387,15 @@
+ /* Return a name for temporary file COUNT. */
+ static char *
+-maketempname (int count)
++maketempname (int count, int can_exist)
+ {
+   static char *tempbase = NULL;
++  char *tempname;
+   char tempsuffix[10];
++  int fd;
+   if (!tempbase)
+     {
+-      int fd;
+       tempbase = concat (tempdir, "txidxXXXXXX");
+       fd = mkstemp (tempbase);
+@@ -403,7 +404,14 @@
+     }
+   sprintf (tempsuffix, ".%d", count);
+-  return concat (tempbase, tempsuffix);
++  tempname = concat (tempbase, tempsuffix);
++  if (!can_exist) {
++    fd = open (tempname, O_CREAT|O_EXCL|O_WRONLY, 0600);
++    if (fd == -1)
++      pfatal_with_name (tempname);
++    close (fd);
++  }
++  return tempname;
+ }
+@@ -415,7 +423,7 @@
+   if (keep_tempfiles)
+     return;
+   while (last_deleted_tempcount < to_count)
+-    unlink (maketempname (++last_deleted_tempcount));
++    unlink (maketempname (++last_deleted_tempcount, 1));
+ }
\f
+@@ -882,7 +890,7 @@
+   for (i = 0; i < ntemps; i++)
+     {
+-      char *outname = maketempname (++tempcount);
++      char *outname = maketempname (++tempcount, 0);
+       FILE *ostream = fopen (outname, "w");
+       long tempsize = 0;
+@@ -930,7 +938,7 @@
+   for (i = 0; i < ntemps; i++)
+     {
+-      char *newtemp = maketempname (++tempcount);
++      char *newtemp = maketempname (++tempcount, 0);
+       sort_in_core (tempfiles[i], MAX_IN_CORE_SORT, newtemp);
+       if (!keep_tempfiles)
+         unlink (tempfiles[i]);
+@@ -1400,7 +1408,7 @@
+       int nf = MAX_DIRECT_MERGE;
+       if (i + 1 == ntemps)
+         nf = nfiles - i * MAX_DIRECT_MERGE;
+-      tempfiles[i] = maketempname (++tempcount);
++      tempfiles[i] = maketempname (++tempcount, 0);
+       value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
+     }