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);
}