From c6a5fcbf434262956cb19645630803a570e61cad Mon Sep 17 00:00:00 2001 From: theobisproject Date: Fri, 15 Jun 2018 22:06:37 +0200 Subject: [PATCH] Prevent resource leaks - The output stream would not have been closed when an exception happened while writing the bytes - The stream from Files.walk needs to be explicitly closed otherwise the handle remains open --- .../java/edu/cmu/sv/kelinci/instrumentor/JarFileIO.java | 6 +++--- .../java/edu/cmu/sv/kelinci/instrumentor/Options.java | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/JarFileIO.java b/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/JarFileIO.java index 4a28e18..131c6ce 100644 --- a/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/JarFileIO.java +++ b/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/JarFileIO.java @@ -47,9 +47,9 @@ public void addFileToJar(String file, byte[] bytes) { Path tmpFile = Paths.get(tempDir.toString()+"/"+file); Files.createDirectories(tmpFile.getParent()); - OutputStream stream = Files.newOutputStream(tmpFile, StandardOpenOption.CREATE); - stream.write(bytes); - stream.close(); + try (final OutputStream stream = Files.newOutputStream(tmpFile, StandardOpenOption.CREATE)) { + stream.write(bytes); + } String command = "jar uf " + outputJar + " -C " + tempDir.toString() + " " + file; Process p = Runtime.getRuntime().exec(command); p.waitFor(); diff --git a/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/Options.java b/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/Options.java index ef0c3c8..05c4ca7 100644 --- a/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/Options.java +++ b/instrumentor/src/main/java/edu/cmu/sv/kelinci/instrumentor/Options.java @@ -1,5 +1,6 @@ package edu.cmu.sv.kelinci.instrumentor; +import java.nio.file.Path; import java.util.HashSet; import java.io.File; import java.io.IOException; @@ -8,6 +9,7 @@ import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.stream.Stream; import org.kohsuke.args4j.Option; @@ -70,9 +72,9 @@ private void loadDirectory(String input, HashSet inputClasses) { dirprefix = input.length(); else dirprefix = input.length()+1; - - try { - Files.walk(Paths.get(input)).filter(Files::isRegularFile).forEach(filePath -> { + + try (Stream stream = Files.walk(Paths.get(input))) { + stream.filter(Files::isRegularFile).forEach(filePath -> { String name = filePath.toString(); System.out.println("Found file " + name); if (name.endsWith(".class")) {