You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2012/03/14 03:48:08 UTC

svn commit: r1300447 - in /commons/proper/io/trunk/src: changes/changes.xml main/java/org/apache/commons/io/FileUtils.java test/java/org/apache/commons/io/FileUtilsTestCase.java

Author: sebb
Date: Wed Mar 14 02:48:08 2012
New Revision: 1300447

URL: http://svn.apache.org/viewvc?rev=1300447&view=rev
Log:
IO-300 FileUtils.moveDirectoryToDirectory removes source directory if destination is a subdirectory

Modified:
    commons/proper/io/trunk/src/changes/changes.xml
    commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
    commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java

Modified: commons/proper/io/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/changes/changes.xml?rev=1300447&r1=1300446&r2=1300447&view=diff
==============================================================================
--- commons/proper/io/trunk/src/changes/changes.xml (original)
+++ commons/proper/io/trunk/src/changes/changes.xml Wed Mar 14 02:48:08 2012
@@ -40,6 +40,9 @@ The <action> type attribute can be add,u
 
   <body>
     <release version="2.2" date="TBA">
+      <action issue="IO-300" dev="sebb" type="fix">
+        FileUtils.moveDirectoryToDirectory removes source directory if destination is a subdirectory
+      </action>        
       <action issue="IO-307" dev="sebb" type="fix">
         ReaderInputStream#read(byte[] b, int off, int len) should check for valid parameters
       </action>        

Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java?rev=1300447&r1=1300446&r2=1300447&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java (original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java Wed Mar 14 02:48:08 2012
@@ -32,6 +32,7 @@ import java.net.URLConnection;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
+import java.security.InvalidParameterException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -2491,6 +2492,9 @@ public class FileUtils {
         }
         boolean rename = srcDir.renameTo(destDir);
         if (!rename) {
+            if (destDir.getCanonicalPath().startsWith(srcDir.getCanonicalPath())) {
+                throw new IOException("Cannot move directory: "+srcDir+" to a subdirectory of itself: "+destDir);
+            }
             copyDirectory( srcDir, destDir );
             deleteDirectory( srcDir );
             if (srcDir.exists()) {

Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java?rev=1300447&r1=1300446&r2=1300447&view=diff
==============================================================================
--- commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java (original)
+++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java Wed Mar 14 02:48:08 2012
@@ -2310,6 +2310,21 @@ public class FileUtilsTestCase extends F
         }
     }
 
+    public void testIO300() throws Exception {
+        final File testDirectory = getTestDirectory();
+        File src = new File(testDirectory, "dir1");
+        File dest = new File(src,"dir2");
+        assertTrue(dest.mkdirs());
+        assertTrue(src.exists());
+        try {
+            FileUtils.moveDirectoryToDirectory(src, dest, false);
+            fail("expected IOException");
+        } catch (IOException ioe) {
+            // expected
+        }
+        assertTrue(src.exists());
+    }
+
     public void testIO276() throws Exception {
         File dir = new File("target", "IO276");
         assertTrue(dir+" should not be present",dir.mkdirs());