Browse Source

bz-62849 Check for filesystem loops due to symbolic links, in DirectoryScanner and Delete task

master
Michael Barker Jaikiran Pai 6 years ago
parent
commit
05bfffa247
4 changed files with 45 additions and 1 deletions
  1. +5
    -0
      src/etc/testcases/core/directoryscanner.xml
  2. +12
    -0
      src/main/org/apache/tools/ant/DirectoryScanner.java
  3. +14
    -1
      src/main/org/apache/tools/ant/taskdefs/Delete.java
  4. +14
    -0
      src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java

+ 5
- 0
src/etc/testcases/core/directoryscanner.xml View File

@@ -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>

+ 12
- 0
src/main/org/apache/tools/ant/DirectoryScanner.java View File

@@ -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)) {


+ 14
- 1
src/main/org/apache/tools/ant/taskdefs/Delete.java View File

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


+ 14
- 0
src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java View File

@@ -132,6 +132,20 @@ public class DirectoryScannerTest {
new String[] {"alpha/beta/gamma"});
}

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


Loading…
Cancel
Save