You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by Robin Green <gr...@hotmail.com> on 2000/03/17 15:35:14 UTC

[PATCH] - updated - Prevents infinite dir recursion

Please ignore the first patch from me fwded by Stefano - it was incorrect.

--- DirectoryScanner.java	Fri Mar 17 14:04:16 2000
+++ DirectoryScanner.java.orig	Thu Mar 16 23:04:42 2000
@@ -132,8 +132,6 @@
  * .class files in all directories under a directory called "modules"
  *
  * @author Arnout J. Kuiper <a 
href="mailto:ajkuiper@wxs.nl">ajkuiper@wxs.nl</a>
- * @author Robin D. Green
- *   <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a>
  */
public class DirectoryScanner {

@@ -150,14 +148,6 @@
         "**/CVS/*",
         "**/.cvsignore"
     };
-
-    /**
-     * Dummy filename to represent parent dir of a dir which doesn't have a
-     * parent. The only purpose is to be able to compare it with equals (),
-     * which doesn't work if null is used. This should be a non-null 
illegal
-     * filename.
-     */
-    private static final String DUMMY_NO_PARENT = "";

     /**
      * The base directory which should be scanned.
@@ -208,27 +198,6 @@
      */
     private Vector dirsExcluded;

-    /**
-     * If this is true, filesystem links that point to a parent of 
themselves
-     * will be followed maximally, until directories that have already been
-     * scanned are reached. (Actually, the current method may repeat 
files.)
-     * If false, they will not be followed at all.
-     * In either case, a series of links that form a loop will be detected.
-     * Setting this to true is not recommended as it may drastically
-     * increase the time required.
-     * False by default.
-     *
-     * @see setMinLoopDetect(boolean)
-     */
-    private boolean minLoopDetect = false;
-
-    /**
-     * This holds filesystem links that have already been traversed,
-     * to prevent them being traversed again.
-     * This acts like a HashSet.
-     */
-    private Hashtable linksSeenAlready;
-


     /**
@@ -607,22 +576,6 @@


     /**
-     * If minLoopDetect is true, filesystem links that point to a parent of
-     * themselves will be followed maximally, until directories that have
-     * already been scanned are reached.
-     * If false, they will not be followed at all.
-     * In either case, a series of links that form a loop will be detected.
-     * Setting minLoopDetect to true is not recommended as it may 
drastically
-     * increase the time required.
-     * False by default.
-     */
-    public void setMinLoopDetect (boolean minLoopDetect) {
-        this.minLoopDetect = minLoopDetect;
-    }
-
-
-
-    /**
      * Scans the base directory for files that match at least one include
      * pattern, and don't match any exclude patterns.
      *
@@ -655,8 +608,6 @@
         dirsNotIncluded  = new Vector();
         dirsExcluded     = new Vector();

-        linksSeenAlready = new Hashtable();
-
         scandir(basedir,"");
     }

@@ -680,58 +631,6 @@
      * @see #dirsExcluded
      */
     private void scandir(File dir, String vpath) {
-
-        /*
-         * RDG: Prevent "infinite" recursion if a filesystem link points to 
a
-         * parent of itself, or if a series of traversed links form a loop.
-         * (Okay, making such a link might not be very sensible,
-         * but the user may have good reasons for doing this, and
-         * indefinite looping isn't desirable behaviour.)
-         */
-        try {
-            String canonicalDir = dir.getCanonicalPath ();
-
-            // XXX: This will stop loops, but dirs may still be repeated.
-            if (linksSeenAlready.contains (canonicalDir)) {
-                return;                   // We've been here already
-            }
-            else {
-                /*
-                 * To save space we only remember links, not all dirs.
-                 * No attempt to detect links pointing to another dir in 
same
-                 * directory, which are harmless anyway.
-                 * Need special handling for filesys roots and links to 
root(s).
-                 */
-                File    canonDirFile    = new File (canonicalDir);
-                String  dirParent       = dir.getParent (),
-                        canonSrcParent  = ((dirParent == null)
-                    ? DUMMY_NO_PARENT
-                    : new File (dirParent).getCanonicalPath ()),
-                        canonDestParent = canonDirFile.getParent ();
-
-                if (canonDestParent == null)
-                    canonDestParent = DUMMY_NO_PARENT;
-                boolean dangerousLink =
-                    !canonDestParent.equals (canonSrcParent);
-
-                if (dangerousLink) {
-                    linksSeenAlready.put (canonicalDir, canonicalDir);
-                }
-                if (!minLoopDetect) {
-                    if (canonSrcParent.startsWith (canonicalDir)) {
-                        /*
-                         * Filesystem link recursion detected.
-                         * For speed, don't bother following it.
-                         */
-                        return;
-                    }
-                }
-            }
-        } catch (IOException ex) {
-            // dir doesn't appear to exist anyway
-            return;
-        }
-
         String[] newfiles = dir.list();
         for (int i = 0; i < newfiles.length; i++) {
             String name = vpath+newfiles[i];

______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com