| [69cde8d] | 1 | Updated By: Bruce Dubbs (bdubbs -aT- linuxfromscratch -DoT- org)
 | 
|---|
 | 2 | Date: 2005-12-12
 | 
|---|
 | 3 | Submitted By: Archaic (archaic -aT- linuxfromscratch -DoT- org)
 | 
|---|
 | 4 | Date: 2005-10-08
 | 
|---|
 | 5 | Initial Package Version: 4.8
 | 
|---|
 | 6 | Origin: http://gentoo.kems.net/gentoo-portage/sys-apps/texinfo/files/texinfo-4.8-tempfile.patch
 | 
|---|
 | 7 | Upstream Status: A few patches are floating around in Debian BZ #328365 of which
 | 
|---|
 | 8 |                  upstream hasn't made a full commitment on yet.
 | 
|---|
 | 9 | Description: (CAN-2005-3011) texindex in texinfo 4.8 and earlier allows local
 | 
|---|
 | 10 |              users to overwrite arbitrary files via a symlink attack on
 | 
|---|
 | 11 |              temporary files.
 | 
|---|
 | 12 | Update: Changed to not pass a constant string to mktemp().
 | 
|---|
 | 13 | 
 | 
|---|
 | 14 | diff -Naur texinfo-4.8.orig/util/texindex.c texinfo-4.8/util/texindex.c
 | 
|---|
 | 15 | --- texinfo-4.8.orig/util/texindex.c    2005-12-11 23:29:08.000000000 -0600
 | 
|---|
 | 16 | +++ texinfo-4.8/util/texindex.c 2005-12-11 23:33:31.000000000 -0600
 | 
|---|
 | 17 | @@ -99,6 +99,9 @@
 | 
|---|
 | 18 |  /* Directory to use for temporary files.  On Unix, it ends with a slash.  */
 | 
|---|
 | 19 |  char *tempdir;
 | 
|---|
 | 20 |  
 | 
|---|
 | 21 | +/* Basename for temp files inside of tempdir.  */
 | 
|---|
 | 22 | +char *tempbase;
 | 
|---|
 | 23 | +
 | 
|---|
 | 24 |  /* Number of last temporary file.  */
 | 
|---|
 | 25 |  int tempcount;
 | 
|---|
 | 26 |  
 | 
|---|
 | 27 | @@ -153,6 +156,7 @@
 | 
|---|
 | 28 |  main (int argc, char **argv)
 | 
|---|
 | 29 |  {
 | 
|---|
 | 30 |    int i;
 | 
|---|
 | 31 | +  char template[]="txidxXXXXXX";
 | 
|---|
 | 32 |  
 | 
|---|
 | 33 |    tempcount = 0;
 | 
|---|
 | 34 |    last_deleted_tempcount = 0;
 | 
|---|
 | 35 | @@ -190,6 +194,11 @@
 | 
|---|
 | 36 |  
 | 
|---|
 | 37 |    decode_command (argc, argv);
 | 
|---|
 | 38 |  
 | 
|---|
 | 39 | +  /* XXX mkstemp not appropriate, as we need to have somewhat predictable
 | 
|---|
 | 40 | +   * names. But race condition was fixed, see maketempname. 
 | 
|---|
 | 41 | +   */
 | 
|---|
 | 42 | +  tempbase = mktemp (template);
 | 
|---|
 | 43 | +
 | 
|---|
 | 44 |    /* Process input files completely, one by one.  */
 | 
|---|
 | 45 |  
 | 
|---|
 | 46 |    for (i = 0; i < num_infiles; i++)
 | 
|---|
 | 47 | @@ -389,21 +398,21 @@
 | 
|---|
 | 48 |  static char *
 | 
|---|
 | 49 |  maketempname (int count)
 | 
|---|
 | 50 |  {
 | 
|---|
 | 51 | -  static char *tempbase = NULL;
 | 
|---|
 | 52 |    char tempsuffix[10];
 | 
|---|
 | 53 | -
 | 
|---|
 | 54 | -  if (!tempbase)
 | 
|---|
 | 55 | -    {
 | 
|---|
 | 56 | -      int fd;
 | 
|---|
 | 57 | -      tempbase = concat (tempdir, "txidxXXXXXX");
 | 
|---|
 | 58 | -
 | 
|---|
 | 59 | -      fd = mkstemp (tempbase);
 | 
|---|
 | 60 | -      if (fd == -1)
 | 
|---|
 | 61 | -        pfatal_with_name (tempbase);
 | 
|---|
 | 62 | -    }
 | 
|---|
 | 63 | +  char *name, *tmp_name;
 | 
|---|
 | 64 | +  int fd;
 | 
|---|
 | 65 |  
 | 
|---|
 | 66 |    sprintf (tempsuffix, ".%d", count);
 | 
|---|
 | 67 | -  return concat (tempbase, tempsuffix);
 | 
|---|
 | 68 | +  tmp_name = concat (tempdir, tempbase);
 | 
|---|
 | 69 | +  name = concat (tmp_name, tempsuffix);
 | 
|---|
 | 70 | +  free(tmp_name);
 | 
|---|
 | 71 | +
 | 
|---|
 | 72 | +  fd = open (name, O_CREAT|O_EXCL|O_WRONLY, 0600);
 | 
|---|
 | 73 | +  if (fd == -1)
 | 
|---|
 | 74 | +    pfatal_with_name (name);
 | 
|---|
 | 75 | +
 | 
|---|
 | 76 | +  close(fd);
 | 
|---|
 | 77 | +  return name;
 | 
|---|
 | 78 |  }
 | 
|---|
 | 79 |  
 | 
|---|
 | 80 | 
 | 
|---|