[Rd] temp Rscript file collision on Windows

Hervé Pagès hpages at fhcrc.org
Wed Sep 29 06:19:14 CEST 2010


Hi,

The code below (found in src/gnuwin32/system.c) is almost
guaranteed to do the wrong thing if 2 Rterm processes are
started at the same time (or less than 1 second apart, the
resolution of time() being 1 second):

   /* tmpfile() seems not to work on Vista: it tries to write in c:/
   ifp = tmpfile();
   */
   {
       char *tm;
       tm = getenv("TMPDIR");
       if (!isDir(tm)) {
           tm = getenv("TMP");
           if (!isDir(tm)) {
               tm = getenv("TEMP");
               if (!isDir(tm))
                   tm = getenv("R_USER"); /* this one will succeed */
           }
       }
       srand( (unsigned) time(NULL) );
       sprintf(ifile, "%s/Rscript%x%x", tm, rand(), rand());
       ifp = fopen(ifile, "w+b");
       if(!ifp) R_Suicide(_("creation of tmpfile failed -- set TMPDIR 
suitably?"));
   }

Because the seed is set to whatever is returned by time(), it's
very easy to have 2 concurrent Rterm processes end up using the
same temp Rscript file. Note that calling rand() twice doesn't
help: if the 2 processes use the same seed, then the 2 consecutive
calls to rand() will generate the same pairs of numbers for the
2 processes.

An unfortunate consequence of this temp Rscript file collision
could very well be what we observe here:

   https://stat.ethz.ch/pipermail/r-devel/2010-September/058464.html

Could the PID be used instead? Something like this:

   sprintf(ifile, "%s/Rscript%dx%x", tm, getpid(), rand());

will surely be much safer. Furthermore, my understanding is that
a given Rterm process needs to create at most 1 temp Rscript file
so maybe using rand() is not even needed.

Note that Unix is safe because tmpfile() is used there (file
src/unix/system.c).

Cheers,
H.

-- 
Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M2-B876
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



More information about the R-devel mailing list