Phil D created IO-808:
-------------------------

             Summary: FileUtils.moveFile, copyFile and others can throw 
undocumened IllegalArgumentException
                 Key: IO-808
                 URL: https://issues.apache.org/jira/browse/IO-808
             Project: Commons IO
          Issue Type: Bug
          Components: Utilities
    Affects Versions: 2.12.0
         Environment: Windows 10
            Reporter: Phil D
         Attachments: TestMoveFileIAE.java

Several of the functions in FileUtils are throwing undocumented 
IllegalArgumentException such as moveFile, copyFile and other locations. 

If the desire is to maintain backwards compatibility with the 1.4 branch for 
these functions, then the 2.12 (and 2.13) versions are throwing 
IllegalArgumentException in cases  where 1.4 is not.  In fact, it seems like 
1.4 was coded to specifically avoid IllegalArgumentException and throws 
IOExceptions instead.

There are several different cases where this is possible.  In the most basic, 
I've attached TestMoveFileIAE, where this can be reproduced by simple running:

{code:bash}
mkdir one
java -cp <your_classpath> TestMoveFileIAE one two
Exception in thread "main" java.lang.IllegalArgumentException: Parameter 
'srcFile' is not a file: one
        at org.apache.commons.io.FileUtils.requireFile(FileUtils.java:2824)
        at org.apache.commons.io.FileUtils.moveFile(FileUtils.java:2395)
        at org.apache.commons.io.FileUtils.moveFile(FileUtils.java:2374)
        at TestMoveFileIAE.main(TestMoveFileIAE.java:13)
{code}

In a less likely scenario (which is how I found this issue because this 
happened on a production system); If the srcFile is removed at a certain point 
during moveFile() execution then IllegalArgumentException is throws:

https://github.com/apache/commons-io/blob/master/src/main/java/org/apache/commons/io/FileUtils.java#L2392

{code:java}
2392    public static void moveFile(final File srcFile, final File destFile, 
final CopyOption... copyOptions) throws IOException {
2393    validateMoveParameters(srcFile, destFile); // checks srcFile.exists()
                /// ==== srcFile deleted here!!!
2394    requireFile(srcFile, "srcFile");           // checks srcFile.isFile() 
and throws IAE
2395    requireAbsent(destFile, "destFile");
                /// ==== srcFile could also be deleted here 
2396    ... // renameTo or copyFile() which also calls validateMoveParameters() 
and requireFile()
{code}

This pattern of calling validateMoveParameters() and requireFile() will throw 
IllegalArgumentException every when the srcFile is removed between between 
validateMoveParameters() or requireFileCopy() and requireFile()

Preferably, it would be best if the 2.x versions of FileUtils were backwards 
compatible with 1.x and IllegalArgumentException would not be thrown, but 
IOException (or one of its derivatives) would be.   IAE is an unchecked 
exception and can cause unexpected issues.

I would also suggest that unit tests be created to ensure that these functions 
behave as expected in error conditions.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to