Shai Shapira created IO-798:
-------------------------------

             Summary: DeferredFileOutputStream throws exception when system 
temp folder is a symlink
                 Key: IO-798
                 URL: https://issues.apache.org/jira/browse/IO-798
             Project: Commons IO
          Issue Type: Bug
          Components: Streams/Writers
    Affects Versions: 2.12.0
            Reporter: Shai Shapira


We have some code that creates an org.apache.commons.fileupload.FileItem and 
writes to its OutputStream. This worked well until commons-io version 12 came 
out, then started to throw a FileAlreadyExistsException. After some 
investigation, this is what seems to be happening:

Our FileItem (created by a DiskFileItemFactory) uses a DeferredFileOutputStream 
as its output stream. DeferredFileOutputStream uses the system temp folder to 
save the file if it gets too big. When saving the file, it wants to create any 
parent folders if they don't already exist.

The problem is, the logic for creating the parent folders seems to have been 
rewritten for version 2.12.0, and now calls:

PathUtils.createParentDirectories({color:#9876aa}outputPath{color}){color:#cc7832};
 _{color:#172b4d}(DeferredFileOutputStream.java, line 333){color}_{color}

{color:#172b4d}This method, by default, uses a parameter telling it not to 
follow links. On our servers, the temp folder is, unfortunately, a link. So the 
method looks at the folder in the file path, and sees the link. Since it does 
not follow links, it just sees that something other than a directory exists in 
this path, and throws an Exception.
{color}

The code looks something like this:

FileItemFactory fileFact = {color:#cc7832}new 
{color}DiskFileItemFactory(){color:#cc7832}; 
{color}FileItem file = fileFact.createItem(fieldName{color:#cc7832}, 
{color}contentType{color:#cc7832}, {color}{color:#cc7832}false, 
{color}fileName){color:#cc7832}; 
{color}{color:#cc7832}try {color}(OutputStream out = file.getOutputStream()) {
{color:#cc7832}{color:#172b4d}<code that writes into{color} 
{_}out{_}{color:#172b4d}>{color}
{color}}

 

And the stack trace:

java.nio.file.FileAlreadyExistsException: /usr/local/apache-tomcat-base/temp at
 
java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:94)
 at
 
java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) 
at
 
java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) 
at
 
java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:389)
 at
 java.base/java.nio.file.Files.createDirectory(Files.java:690) at
 java.base/java.nio.file.Files.createAndCheckIsDirectory(Files.java:797) at
 java.base/java.nio.file.Files.createDirectories(Files.java:743) at
 
org.apache.commons.io.file.PathUtils.createParentDirectories(PathUtils.java:383)
 at
 
org.apache.commons.io.file.PathUtils.createParentDirectories(PathUtils.java:367)
 at
 
org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:333)
 at
 
org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:105)
 at
 
org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:231)
 at



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

Reply via email to