Skip to content

Commit

Permalink
Don't close nested jars or wrapper when parent is closed
Browse files Browse the repository at this point in the history
Update `JarFile` so that the `close()` method no longer closes nested
jars or the wrapper. Prior to this commit it was possible for a parent
jar file to be garbage collected and closed even though references still
existed to the nested jars. When this happened the nested jars would get
closed and any access to entries would result in `JarFile.ensureOpen()`
throwing an `IllegalStateException`. The user would often not see this
exception directly, but rather find `ClassNotFoundException` being
thrown.

Fixes gh-31853
  • Loading branch information
philwebb committed Aug 16, 2022
1 parent 48443c9 commit 360eb02
Showing 1 changed file with 1 addition and 14 deletions.
Expand Up @@ -26,11 +26,8 @@
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.security.Permission;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Supplier;
Expand Down Expand Up @@ -96,8 +93,6 @@ public class JarFile extends AbstractJarFile implements Iterable<java.util.jar.J

private volatile JarFileWrapper wrapper;

private final List<JarFile> nestedJars = Collections.synchronizedList(new ArrayList<>());

/**
* Create a new {@link JarFile} backed by the specified file.
* @param file the root jar file
Expand Down Expand Up @@ -340,10 +335,8 @@ private JarFile createJarFileFromFileEntry(JarEntry entry) throws IOException {
+ "mechanism used to create your executable jar file");
}
RandomAccessData entryData = this.entries.getEntryData(entry.getName());
JarFile nestedJar = new JarFile(this.rootFile, this.pathFromRoot + "!/" + entry.getName(), entryData,
return new JarFile(this.rootFile, this.pathFromRoot + "!/" + entry.getName(), entryData,
JarFileType.NESTED_JAR);
this.nestedJars.add(nestedJar);
return nestedJar;
}

@Override
Expand All @@ -368,12 +361,6 @@ public void close() throws IOException {
if (this.type == JarFileType.DIRECT) {
this.rootFile.close();
}
if (this.wrapper != null) {
this.wrapper.close();
}
for (JarFile nestedJar : this.nestedJars) {
nestedJar.close();
}
this.closed = true;
}
}
Expand Down

0 comments on commit 360eb02

Please sign in to comment.