You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ja...@apache.org on 2018/11/03 12:13:10 UTC
ant git commit: bz-62849 Check for filesystem loops due to symbolic
links, in DirectoryScanner and Delete task
Repository: ant
Updated Branches:
refs/heads/1.9.x f1d2c1551 -> 05bfffa24
bz-62849 Check for filesystem loops due to symbolic links, in DirectoryScanner and Delete task
Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/05bfffa2
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/05bfffa2
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/05bfffa2
Branch: refs/heads/1.9.x
Commit: 05bfffa247c470d12a5b93326a05d3fd0d890ce0
Parents: f1d2c15
Author: Michael Barker <mi...@gmail.com>
Authored: Sat Nov 3 17:41:10 2018 +0530
Committer: Jaikiran Pai <ja...@apache.org>
Committed: Sat Nov 3 17:41:10 2018 +0530
----------------------------------------------------------------------
src/etc/testcases/core/directoryscanner.xml | 5 +++++
src/main/org/apache/tools/ant/DirectoryScanner.java | 12 ++++++++++++
src/main/org/apache/tools/ant/taskdefs/Delete.java | 15 ++++++++++++++-
.../org/apache/tools/ant/DirectoryScannerTest.java | 14 ++++++++++++++
4 files changed, 45 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant/blob/05bfffa2/src/etc/testcases/core/directoryscanner.xml
----------------------------------------------------------------------
diff --git a/src/etc/testcases/core/directoryscanner.xml b/src/etc/testcases/core/directoryscanner.xml
index 7e8683a..71eb88b 100644
--- a/src/etc/testcases/core/directoryscanner.xml
+++ b/src/etc/testcases/core/directoryscanner.xml
@@ -38,4 +38,9 @@
<touch file="${output}/alpha/beta/gamma/gamma.xml"/>
</target>
+ <target name="symlink-nested-setup" depends="setUp">
+ <symlink link="${output}/alpha/beta/gamma/beta-link" resource="${output}/alpha/beta"/>
+ <touch file="${output}/alpha/beta/gamma/gamma.xml"/>
+ </target>
+
</project>
http://git-wip-us.apache.org/repos/asf/ant/blob/05bfffa2/src/main/org/apache/tools/ant/DirectoryScanner.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java
index a0e7837..15caa40 100644
--- a/src/main/org/apache/tools/ant/DirectoryScanner.java
+++ b/src/main/org/apache/tools/ant/DirectoryScanner.java
@@ -1258,6 +1258,18 @@ public class DirectoryScanner
final String name = vpath + newFile;
final TokenizedPath newPath = new TokenizedPath(path, newFile);
final File file = new File(dir, newFile);
+
+ try {
+ // check if it's a filesystem "loop" due to symbolic links
+ if (FileUtils.getFileUtils().isLeadingPath(file.getAbsoluteFile(),
+ dir.getAbsoluteFile(), true)) {
+ continue;
+ }
+ } catch (IOException e) {
+ System.err.println("Failed to determine if " + file + " causes a " +
+ "filesystem loop due to symbolic link; continuing");
+ }
+
final String[] children = file.list();
if (children == null || (children.length == 0 && file.isFile())) {
if (isIncluded(newPath)) {
http://git-wip-us.apache.org/repos/asf/ant/blob/05bfffa2/src/main/org/apache/tools/ant/taskdefs/Delete.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Delete.java b/src/main/org/apache/tools/ant/taskdefs/Delete.java
index f887695..fdddbbf 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Delete.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Delete.java
@@ -19,6 +19,7 @@
package org.apache.tools.ant.taskdefs;
import java.io.File;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
@@ -771,7 +772,19 @@ public class Delete extends MatchingTask {
}
for (String s : list) {
File f = new File(d, s);
- if (f.isDirectory()) {
+
+ boolean isFsLoop = false;
+
+ try {
+ isFsLoop = SYMLINK_UTILS.isSymbolicLink(f) &&
+ FileUtils.getFileUtils().isLeadingPath(f.getAbsoluteFile(),
+ d.getAbsoluteFile(), true);
+ } catch (IOException e) {
+ log("Failed to check if " + f + " causes a filesystem loop due to " +
+ "symbolic link; continuing");
+ }
+
+ if (f.isDirectory() && !isFsLoop) {
removeDir(f);
} else {
log("Deleting " + f.getAbsolutePath(), quiet ? Project.MSG_VERBOSE : verbosity);
http://git-wip-us.apache.org/repos/asf/ant/blob/05bfffa2/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java b/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
index 819d4e5..2abd94f 100644
--- a/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
+++ b/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
@@ -133,6 +133,20 @@ public class DirectoryScannerTest {
}
@Test
+ public void testAllowRecursiveSymlinks() {
+
+ assumeTrue("Current system does not support Symlinks", supportsSymlinks);
+
+ buildRule.getProject().executeTarget("symlink-nested-setup");
+ DirectoryScanner ds = new DirectoryScanner();
+ ds.setBasedir(new File(buildRule.getProject().getProperty("output")));
+ ds.setIncludes(new String[] {"alpha/beta/gamma/"});
+ ds.scan();
+ compareFiles(ds, new String[] {"alpha/beta/gamma/gamma.xml"},
+ new String[] {"alpha/beta/gamma"});
+ }
+
+ @Test
public void testProhibitSymlinks() {
assumeTrue("Current system does not support Symlinks", supportsSymlinks);