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)
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?
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