Bug 46559

Summary: org.apache.tools.zip.ZipFile leaves open file after RuntimeException
Product: Ant Reporter: Fred Stoki <highnoon>
Component: CoreAssignee: Ant Notifications List <notifications>
Status: RESOLVED FIXED    
Severity: normal CC: notifications
Priority: P2    
Version: 1.7.1   
Target Milestone: 1.8.0   
Hardware: PC   
OS: Windows XP   

Description Fred Stoki 2009-01-19 04:59:28 UTC
When a corrupted zip is read the method "resolveLocalFileHeaderData()" will throw a RuntimeException. This exception is never caught so the archive file is never closed and remains opened.  The code calling constructor never gets a handle on the object, so you can't close the archive.  The Archive remains open until JVM exits.

    public ZipFile(File f, String encoding) throws IOException {
        this.encoding = encoding;
        archive = new RandomAccessFile(f, "r");
        try {
            populateFromCentralDirectory();
            resolveLocalFileHeaderData();
        } catch (IOException e) {
            try {
                archive.close();
            } catch (IOException e2) {
                // swallow, throw the original exception instead
            }
            throw e;
        }
    }


The RuntimeException stack
RuntimeException: data starting at 49679 is in unknown format
at org.apache.tools.zip.ZipEntry.setExtra(ZipEntry.java:268)
at org.apache.tools.zip.ZipFile.resolveLocalFileHeaderData(ZipFile.java:445)
at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:144)
at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:102)
Comment 1 Stefan Bodewig 2009-01-26 21:09:31 UTC
I can easily think of a patch, but would love to have a test case.

Can you provide a testcase that will trigger a RuntimeExcpetion inside the constructor?
Comment 2 Stefan Bodewig 2009-01-29 05:25:02 UTC
For now I've used the jar attached to bug 42940 which will need to be changed once that bug is fixed.

Testcase added and Ant fixed with svn revision 738853