Commit 74daec8c by H.J. Lu Committed by H.J. Lu

re PR java/25330 (A race condition in write_classfile)

2005-12-12  H.J. Lu  <hongjiu.lu@intel.com>

	PR java/25330
	* jcf-write.c (write_classfile): Use PID in temporary class
	file. Save/restore errno when reporting error.

From-SVN: r108411
parent 22e0395a
2005-12-12 H.J. Lu <hongjiu.lu@intel.com>
PR java/25330
* jcf-write.c (write_classfile): Use PID in temporary class
file. Save/restore errno when reporting error.
2005-12-10 Terry Laurenzo <tlaurenzo@gmail.com> 2005-12-10 Terry Laurenzo <tlaurenzo@gmail.com>
PR java/9861 PR java/9861
......
...@@ -3522,11 +3522,15 @@ write_classfile (tree clas) ...@@ -3522,11 +3522,15 @@ write_classfile (tree clas)
{ {
FILE *stream; FILE *stream;
char *temporary_file_name; char *temporary_file_name;
char pid [sizeof (long) * 2 + 2];
/* The .class file is initially written to a ".tmp" file so that /* The .class file is initially written to a ".PID" file so that
if multiple instances of the compiler are running at once if multiple instances of the compiler are running at once
they do not see partially formed class files. */ they do not see partially formed class files nor override
temporary_file_name = concat (class_file_name, ".tmp", NULL); each other, which may happen in libjava with parallel build.
*/
sprintf (pid, ".%lx", (unsigned long) getpid ());
temporary_file_name = concat (class_file_name, pid, NULL);
stream = fopen (temporary_file_name, "wb"); stream = fopen (temporary_file_name, "wb");
if (stream == NULL) if (stream == NULL)
fatal_error ("can't open %s for writing: %m", temporary_file_name); fatal_error ("can't open %s for writing: %m", temporary_file_name);
...@@ -3548,7 +3552,9 @@ write_classfile (tree clas) ...@@ -3548,7 +3552,9 @@ write_classfile (tree clas)
if (rename (temporary_file_name, class_file_name) == -1) if (rename (temporary_file_name, class_file_name) == -1)
{ {
int errno_saved = errno;
remove (temporary_file_name); remove (temporary_file_name);
errno = errno_saved;
fatal_error ("can't create %s: %m", class_file_name); fatal_error ("can't create %s: %m", class_file_name);
} }
free (temporary_file_name); free (temporary_file_name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment