On Son, 02 Okt 2005, Karl Berry wrote:
> It's up to you, but I don't advise it.  It reverts many declarations to
> K&R form (i.e., a much older texindex.c).  Aside from that, it also
> reverts at least one bug fix I made regarding initials (years ago).
> 
> Perhaps you or someone could work on just making a patch which fixes the
> race condition without all the other extraneous (and undesirable) changes.
> That would help me.

Can you please comment on my first try on this, attached. I removed all
the unneccessary stuff I found, and it still compiles. 

Please comment.

Best wishes

Norbert

-------------------------------------------------------------------------------
Dr. Norbert Preining <preining AT logic DOT at>             Università di Siena
sip:[EMAIL PROTECTED]                             +43 (0) 59966-690018
gpg DSA: 0x09C5B094      fp: 14DF 2E6C 0307 BE6D AD76  A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
SCORRIER (n.)
A small hunting dog trained to snuffle amongst your private parts.
                        --- Douglas Adams, The Meaning of Liff
--- /src/debian-tex/pkg-texlive/texinfo/branches/upstream/4.8/util/texindex.c   
2004-04-11 19:56:47.000000000 +0200
+++ util/texindex.c     2005-10-02 23:47:05.000000000 +0200
@@ -99,6 +99,9 @@
 /* Directory to use for temporary files.  On Unix, it ends with a slash.  */
 char *tempdir;
 
+/* Start of filename to use for temporary files.  */
+char *tempbase;
+
 /* Number of last temporary file.  */
 int tempcount;
 
@@ -144,7 +147,7 @@
 void fatal (const char *format, const char *arg);
 void error (const char *format, const char *arg);
 void *xmalloc (), *xrealloc ();
-char *concat (char *s1, char *s2);
+char *concat (char *s1, char *s2, char *s3);
 void flush_tempfiles (int to_count);
 
 #define MAX_IN_CORE_SORT 500000
@@ -190,6 +193,11 @@
 
   decode_command (argc, argv);
 
+  /* XXX mkstemp not appropriate, as we need to have somewhat predictable
+   * names. But race condition was fixed, see maketempname.
+   */
+  tempbase = mktemp (concat ("txiXXXXXX", "", ""));
+
   /* Process input files completely, one by one.  */
 
   for (i = 0; i < num_infiles; i++)
@@ -220,7 +228,7 @@
 
       outfile = outfiles[i];
       if (!outfile)
-        outfile = concat (infiles[i], "s");
+        outfile = concat (infiles[i], "s", "");
 
       need_initials = 0;
       first_initial = '\0';
@@ -318,7 +326,7 @@
   if (tempdir == NULL)
     tempdir = DEFAULT_TMPDIR;
   else
-    tempdir = concat (tempdir, "/");
+    tempdir = concat (tempdir, "/", "");
 
   keep_tempfiles = 0;
 
@@ -384,26 +392,25 @@
     usage (1);
 }
 
-/* Return a name for temporary file COUNT. */
+/* Return a name for a temporary file. */
 
 static char *
 maketempname (int count)
 {
-  static char *tempbase = NULL;
   char tempsuffix[10];
+  char *name;
+  int fd;
 
-  if (!tempbase)
+  sprintf (tempsuffix, ".%d", count);
+  name =  concat (tempdir, tempbase, tempsuffix);
+  fd = open (name, O_CREAT|O_EXCL|O_WRONLY, 0666);
+  if (fd == -1)
+    return NULL;
+  else
     {
-      int fd;
-      tempbase = concat (tempdir, "txidxXXXXXX");
-
-      fd = mkstemp (tempbase);
-      if (fd == -1)
-        pfatal_with_name (tempbase);
+      close(fd);
+      return(name);
     }
-
-  sprintf (tempsuffix, ".%d", count);
-  return concat (tempbase, tempsuffix);
 }
 
 
@@ -931,6 +938,8 @@
   for (i = 0; i < ntemps; i++)
     {
       char *newtemp = maketempname (++tempcount);
+      if (!newtemp)
+        pfatal_with_name("temp file");
       sort_in_core (tempfiles[i], MAX_IN_CORE_SORT, newtemp);
       if (!keep_tempfiles)
         unlink (tempfiles[i]);
@@ -1401,6 +1410,8 @@
       if (i + 1 == ntemps)
         nf = nfiles - i * MAX_DIRECT_MERGE;
       tempfiles[i] = maketempname (++tempcount);
+      if (!tempfiles[i])
+       pfatal_with_name("temp file");
       value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
     }
 
@@ -1615,14 +1626,15 @@
 /* Return a newly-allocated string concatenating S1 and S2.  */
 
 char *
-concat (char *s1, char *s2)
+concat (char *s1, char *s2, char *s3)
 {
-  int len1 = strlen (s1), len2 = strlen (s2);
-  char *result = (char *) xmalloc (len1 + len2 + 1);
+  int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+  char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
 
   strcpy (result, s1);
   strcpy (result + len1, s2);
-  *(result + len1 + len2) = 0;
+  strcpy (result + len1 + len2, s3);
+  *(result + len1 + len2 + len3) = 0;
 
   return result;
 }

Reply via email to