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 <mike...@gmail.com> Authored: Sat Nov 3 17:41:10 2018 +0530 Committer: Jaikiran Pai <jaiki...@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);