You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Michael Osipov (Jira)" <ji...@apache.org> on 2023/06/02 16:40:00 UTC

[jira] [Updated] (IO-798) DeferredFileOutputStream throws exception when system temp dir is a symlink

     [ https://issues.apache.org/jira/browse/IO-798?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Michael Osipov updated IO-798:
------------------------------
    Summary: DeferredFileOutputStream throws exception when system temp dir is a symlink  (was: DeferredFileOutputStream throws exception when system temp folder is a symlink)

> DeferredFileOutputStream throws exception when system temp dir 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
>            Priority: Minor
>
> 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)