From dc25eedfc38a4e1de0b78fbcd0955766e1ebcfe6 Mon Sep 17 00:00:00 2001 From: Marc Zwart Date: Tue, 20 Mar 2018 14:18:42 +0100 Subject: [PATCH] fixed unclosed resources in copy method in mage framework Copier --- .../java/mage/server/game/GameReplay.java | 2 +- Mage/src/main/java/mage/util/Copier.java | 15 +++++++--- Mage/src/main/java/mage/util/StreamUtils.java | 30 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 Mage/src/main/java/mage/util/StreamUtils.java diff --git a/Mage.Server/src/main/java/mage/server/game/GameReplay.java b/Mage.Server/src/main/java/mage/server/game/GameReplay.java index c8834b8628d..dd41f89c10f 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameReplay.java +++ b/Mage.Server/src/main/java/mage/server/game/GameReplay.java @@ -91,7 +91,7 @@ public class GameReplay { try{ file = new FileInputStream("saved/" + gameId.toString() + ".game"); buffer = new BufferedInputStream(file); - input = new CopierObjectInputStream(Main.classLoader, new GZIPInputStream(buffer)) + input = new CopierObjectInputStream(Main.classLoader, new GZIPInputStream(buffer)); Game loadGame = (Game) input.readObject(); GameStates states = (GameStates) input.readObject(); loadGame.loadGameStates(states); diff --git a/Mage/src/main/java/mage/util/Copier.java b/Mage/src/main/java/mage/util/Copier.java index e6b7aa4b490..df5b6772be5 100644 --- a/Mage/src/main/java/mage/util/Copier.java +++ b/Mage/src/main/java/mage/util/Copier.java @@ -50,22 +50,29 @@ public class Copier { public T copy(T obj) { T copy = null; + + FastByteArrayOutputStream fbos = null; + ObjectOutputStream out = null; + ObjectInputStream in = null; try { - FastByteArrayOutputStream fbos = new FastByteArrayOutputStream(); - ObjectOutputStream out= new ObjectOutputStream(fbos); + fbos = new FastByteArrayOutputStream(); + out = new ObjectOutputStream(fbos); // Write the object out to a byte array out.writeObject(obj); out.flush(); - out.close(); // Retrieve an input stream from the byte array and read // a copy of the object back in. - ObjectInputStream in = new CopierObjectInputStream(loader, fbos.getInputStream()); + in = new CopierObjectInputStream(loader, fbos.getInputStream()); copy = (T) in.readObject(); } catch(IOException | ClassNotFoundException e) { e.printStackTrace(); + } finally { + StreamUtils.closeQuietly(fbos); + StreamUtils.closeQuietly(out); + StreamUtils.closeQuietly(in); } return copy; diff --git a/Mage/src/main/java/mage/util/StreamUtils.java b/Mage/src/main/java/mage/util/StreamUtils.java new file mode 100644 index 00000000000..2be62157c39 --- /dev/null +++ b/Mage/src/main/java/mage/util/StreamUtils.java @@ -0,0 +1,30 @@ +package mage.util; + +import java.io.Closeable; + +public final class StreamUtils { + + /*** + * Quietly closes the closable, ignoring nulls and exceptions + * @param c - the closable to be closed + */ + public static void closeQuietly(Closeable c) { + if (c != null) { + try { + c.close(); + } + catch (Exception e) { + } + } + } + + public static void closeQuietly(AutoCloseable ac) { + if (ac != null) { + try { + ac.close(); + } + catch (Exception e) { + } + } + } +}