Author: bodewig
Date: Tue Dec 31 11:36:53 2013
New Revision: 1554403

URL: http://svn.apache.org/r1554403
Log:
weed out race-condition in mkdirs calls inspired by PR 55290 and Matthias 
Bhend's suggestion

Modified:
    ant/core/trunk/CONTRIBUTORS
    ant/core/trunk/WHATSNEW
    ant/core/trunk/contributors.xml
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Copy.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Move.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Tar.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java
    
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java
    
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
    
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java
    ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
    ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java

Modified: ant/core/trunk/CONTRIBUTORS
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/CONTRIBUTORS?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/CONTRIBUTORS (original)
+++ ant/core/trunk/CONTRIBUTORS Tue Dec 31 11:36:53 2013
@@ -239,6 +239,7 @@ Matthew Hawthorne
 Matthew Inger
 Matthew Kuperus Heun
 Matthew Watson
+Matthias Bhend
 Michael Bayne
 Michael Clarke
 Michael Davey

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Dec 31 11:36:53 2013
@@ -17,6 +17,10 @@ Fixed bugs:
    different resource types.
    Bugzilla Report 55097
 
+ * several calls to File#mkdirs could fall victim to a race condition
+   where another thread already created the same directory.
+   Bugzilla Report 55290
+
 Other changes:
 --------------
 

Modified: ant/core/trunk/contributors.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/contributors.xml?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/contributors.xml (original)
+++ ant/core/trunk/contributors.xml Tue Dec 31 11:36:53 2013
@@ -925,14 +925,6 @@
     <last>von Gagern</last>
   </name>
   <name>
-    <first>Mathieu</first>
-    <last>Champlon</last>
-  </name>
-  <name>
-    <first>Mathieu</first>
-    <last>Peltier</last>
-  </name>
-  <name>
     <first>Matt</first>
     <last>Albrecht</last>
   </name>
@@ -961,6 +953,22 @@
     <last>Small</last>
   </name>
   <name>
+    <first>Matt</first>
+    <last>Wildig</last>
+  </name>
+  <name>
+    <first>Mathieu</first>
+    <last>Champlon</last>
+  </name>
+  <name>
+    <first>Mathieu</first>
+    <last>Peltier</last>
+  </name>
+  <name>
+    <first>Matthias</first>
+    <last>Bhend</last>
+  </name>
+  <name>
     <first>Matthew</first>
     <last>Hawthorne</last>
   </name>

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Copy.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Copy.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Copy.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Copy.java Tue Dec 31 
11:36:53 2013
@@ -915,7 +915,7 @@ public class Copy extends Task {
                 for (int i = 0; i < dirs.length; i++) {
                     File d = new File(dirs[i]);
                     if (!d.exists()) {
-                        if (!d.mkdirs()) {
+                        if (!(d.mkdirs() || d.isDirectory())) {
                             log("Unable to create directory "
                                 + d.getAbsolutePath(), Project.MSG_ERR);
                         } else {

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Move.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Move.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Move.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Move.java Tue Dec 31 
11:36:53 2013
@@ -178,7 +178,7 @@ public class Move extends Copy {
                     }
                     File d = new File(toDirNames[i]);
                     if (!d.exists()) {
-                        if (!d.mkdirs()) {
+                        if (!(d.mkdirs() || d.exists())) {
                             log("Unable to create directory "
                                     + d.getAbsolutePath(), Project.MSG_ERR);
                         } else {

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Tar.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Tar.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Tar.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Tar.java Tue Dec 31 
11:36:53 2013
@@ -281,7 +281,8 @@ public class Tar extends MatchingTask {
             }
 
             File parent = tarFile.getParentFile();
-            if (parent != null && !parent.isDirectory() && !parent.mkdirs()) {
+            if (parent != null && !parent.isDirectory()
+                && !(parent.mkdirs() || parent.isDirectory())) {
                 throw new BuildException("Failed to create missing parent"
                                          + " directory for " + tarFile);
             }

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java Tue 
Dec 31 11:36:53 2013
@@ -896,7 +896,7 @@ public class XSLTProcess extends Matchin
     private void ensureDirectoryFor(File targetFile) throws BuildException {
         File directory = targetFile.getParentFile();
         if (!directory.exists()) {
-            if (!directory.mkdirs()) {
+            if (!(directory.mkdirs() || directory.isDirectory())) {
                 handleError("Unable to create directory: "
                             + directory.getAbsolutePath());
             }

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java Tue Dec 31 
11:36:53 2013
@@ -645,7 +645,8 @@ public class Zip extends MatchingTask {
             }
 
             File parent = zipFile.getParentFile();
-            if (parent != null && !parent.isDirectory() && !parent.mkdirs()) {
+            if (parent != null && !parent.isDirectory()
+                && !(parent.mkdirs() || parent.isDirectory())) {
                 throw new BuildException("Failed to create missing parent"
                                          + " directory for " + zipFile);
             }

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java 
Tue Dec 31 11:36:53 2013
@@ -87,7 +87,8 @@ public class Gcj extends DefaultCompiler
             cmd.createArgument().setValue("-d");
             cmd.createArgument().setFile(destDir);
 
-            if (!destDir.exists() && !destDir.mkdirs()) {
+            if (!destDir.exists()
+                && !(destDir.mkdirs() || destDir.isDirectory())) {
                 throw new BuildException("Can't make output directories. "
                                          + "Maybe permission is wrong. ");
             }

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java
 (original)
+++ 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java
 Tue Dec 31 11:36:53 2013
@@ -279,7 +279,8 @@ public class Native2Ascii extends Matchi
         if (parentName != null) {
             File parentFile = new File(parentName);
 
-            if ((!parentFile.exists()) && (!parentFile.mkdirs())) {
+            if (!parentFile.exists()
+                && !(parentFile.mkdirs() || parentFile.isDirectory())) {
                 throw new BuildException("cannot create parent directory "
                                          + parentName);
             }

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java 
(original)
+++ 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java 
Tue Dec 31 11:36:53 2013
@@ -305,7 +305,8 @@ public class Image extends MatchingTask 
             }
 
             File dstParent = newFile.getParentFile();
-            if (!dstParent.isDirectory() && !dstParent.mkdirs()){
+            if (!dstParent.isDirectory()
+                && !(dstParent.mkdirs() || dstParent.isDirectory())) {
                 throw new BuildException("Failed to create parent directory "
                                          + dstParent);
             }

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java 
(original)
+++ 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java 
Tue Dec 31 11:36:53 2013
@@ -319,7 +319,7 @@ public class Pvcs extends org.apache.too
                         if (!dir.exists()) {
                             log("Creating " + dir.getAbsolutePath(),
                                 Project.MSG_VERBOSE);
-                            if (dir.mkdirs()) {
+                            if (dir.mkdirs() || dir.isDirectory()) {
                                 log("Created " + dir.getAbsolutePath(),
                                     Project.MSG_INFO);
                             } else {

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java 
Tue Dec 31 11:36:53 2013
@@ -362,7 +362,7 @@ public abstract class SOS extends Task i
             // make sure localDir exists, create it if it doesn't
             File dir = getProject().resolveFile(localPath);
             if (!dir.exists()) {
-                boolean done = dir.mkdirs();
+                boolean done = dir.mkdirs() || dir.isDirectory();
                 if (!done) {
                     String msg = "Directory " + localPath + " creation was not 
"
                         + "successful for an unknown reason";

Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java Tue Dec 31 
11:36:53 2013
@@ -1308,7 +1308,8 @@ public class FileUtils {
             throw new IOException("Failed to delete " + to + " while trying to 
rename " + from);
         }
         File parent = to.getParentFile();
-        if (parent != null && !parent.exists() && !parent.mkdirs()) {
+        if (parent != null && !parent.isDirectory()
+            && !(parent.mkdirs() || parent.isDirectory())) {
             throw new IOException("Failed to create directory " + parent
                                   + " while trying to rename " + from);
         }

Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java?rev=1554403&r1=1554402&r2=1554403&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java Tue 
Dec 31 11:36:53 2013
@@ -513,7 +513,7 @@ public class ResourceUtils {
 
             File parent = destFile.getParentFile();
             if (parent != null && !parent.isDirectory()
-                && !destFile.getParentFile().mkdirs()) {
+                && !(parent.mkdirs() || parent.isDirectory())) {
                 throw new IOException("failed to create the parent directory"
                                       + " for " + destFile);
             }


Reply via email to