[jboss-jira] [JBoss JIRA] Updated: (JBCOMMON-82) FileUrlConnection can leak file descriptors
Stanislav Paskalev (JIRA)
jira-events at lists.jboss.org
Tue Aug 3 04:53:49 EDT 2010
[ https://jira.jboss.org/browse/JBCOMMON-82?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stanislav Paskalev updated JBCOMMON-82:
---------------------------------------
Attachment: FileURLConnection.java
A patched FileURLConnection that caches the input and output streams.
> FileUrlConnection can leak file descriptors
> -------------------------------------------
>
> Key: JBCOMMON-82
> URL: https://jira.jboss.org/browse/JBCOMMON-82
> Project: JBoss Common
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: common-core (2.x)
> Affects Versions: 2.2.11.GA
> Environment: jdk 1.6
> Reporter: Nikolay Tsankov
> Attachments: FileURLConnection.java
>
>
> The following code demonstrates the problem, I would suggest storing the FileInputStream on first call of getInputStream() and return it on subsequent calls :
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.InputStream;
> import java.io.OutputStream;
> import org.jboss.net.protocol.file.FileURLConnection;
> public class FileUrlConnectionBug {
>
> static File dir = new File("C:/test_file_url_connection");
>
> public static void main(String[] args) throws Exception {
> File tmp = makeFile("file.txt");
> FileURLConnection connection = new FileURLConnection(tmp.toURI().toURL());
> InputStream inputStream = connection.getInputStream();
> //get the content, which is also an input stream
> //calling this method causes getInputStream() to be called twice, see getContent()
> //in java.net.URLConnection
> InputStream contentInputStream = (InputStream) connection.getContent();
> //close both streams
> inputStream.close();
> contentInputStream.close();
>
> //file cannot be deleted, as there is an open file descriptor left
> if (!tmp.delete()) {
> System.err.println("Streams closed, but file cannot be deleted after getContent() is called");
> }
>
> //When getContent() is not called, everything is ok, file can be deleted
> File tmpOk = makeFile("fileOk.txt");
> FileURLConnection connectionOk = new FileURLConnection(tmpOk.toURI().toURL());
> InputStream inputStreamOk = connectionOk.getInputStream();
> inputStreamOk.close();
>
> if (tmpOk.delete()) {
> System.out.println("File deleted ok if getContent() is not called");
> }
> }
> private static File makeFile(String name) throws Exception {
> dir.mkdir();
> File tmp = new File(dir, name);
> OutputStream out = new FileOutputStream(tmp);
> out.write(1);
> out.close();
> return tmp;
> }
>
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list