JarScanner: Fix resource leak flagged by infer
This fixes resource leak with JarFile instance acquired by call to
ctor of JarScanner.
Bug: Issue 5198
Change-Id: I80feabcf9e0bfd683d1d8c47f3fd6c9be3ff65a6
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
index ac84e82..280795a2 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
@@ -163,20 +163,21 @@
private String getNewSecureStoreClassName(Path secureStore)
throws IOException {
- JarScanner scanner = new JarScanner(secureStore);
- List<String> newSecureStores =
- scanner.findSubClassesOf(SecureStore.class);
- if (newSecureStores.isEmpty()) {
- throw new RuntimeException(String.format(
- "Cannot find implementation of SecureStore interface in %s",
- secureStore.toAbsolutePath()));
+ try (JarScanner scanner = new JarScanner(secureStore)) {
+ List<String> newSecureStores =
+ scanner.findSubClassesOf(SecureStore.class);
+ if (newSecureStores.isEmpty()) {
+ throw new RuntimeException(String.format(
+ "Cannot find implementation of SecureStore interface in %s",
+ secureStore.toAbsolutePath()));
+ }
+ if (newSecureStores.size() > 1) {
+ throw new RuntimeException(String.format(
+ "Found too many implementations of SecureStore:\n%s\nin %s", Joiner
+ .on("\n").join(newSecureStores), secureStore.toAbsolutePath()));
+ }
+ return Iterables.getOnlyElement(newSecureStores);
}
- if (newSecureStores.size() > 1) {
- throw new RuntimeException(String.format(
- "Found too many implementations of SecureStore:\n%s\nin %s", Joiner
- .on("\n").join(newSecureStores), secureStore.toAbsolutePath()));
- }
- return Iterables.getOnlyElement(newSecureStores);
}
private String getCurrentSecureStoreClassName(SitePaths sitePaths) {
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
index 8ccdebc..1668387 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -310,13 +310,12 @@
return null;
}
- try {
- Path secureStoreLib = Paths.get(secureStore);
- if (!Files.exists(secureStoreLib)) {
- throw new InvalidSecureStoreException(String.format(
- "File %s doesn't exist", secureStore));
- }
- JarScanner scanner = new JarScanner(secureStoreLib);
+ Path secureStoreLib = Paths.get(secureStore);
+ if (!Files.exists(secureStoreLib)) {
+ throw new InvalidSecureStoreException(String.format(
+ "File %s doesn't exist", secureStore));
+ }
+ try (JarScanner scanner = new JarScanner(secureStoreLib)) {
List<String> secureStores =
scanner.findSubClassesOf(SecureStore.class);
if (secureStores.isEmpty()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
index 3dc4c0b..db564cc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
@@ -53,7 +53,7 @@
import java.util.jar.JarFile;
import java.util.jar.Manifest;
-public class JarScanner implements PluginContentScanner {
+public class JarScanner implements PluginContentScanner, AutoCloseable {
private static final int SKIP_ALL = ClassReader.SKIP_CODE
| ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES;
private final JarFile jarFile;
@@ -131,6 +131,11 @@
return findSubClassesOf(superClass.getName());
}
+ @Override
+ public void close() throws IOException {
+ jarFile.close();
+ }
+
private List<String> findSubClassesOf(String superClass) throws IOException {
String name = superClass.replace('.', '/');