From de2b204646c1c1e531d78bf991bb1740e46846b9 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 6 Mar 2012 14:02:12 +0000
Subject: [PATCH]   * viewstat.jsp: Properly close the ImageOutputStream to fix
     NPEs in the finalizer, probably was the root cause of     what we blamed
 on Jetty

---
 .../java/src/net/i2p/router/web/StatSummarizer.java         | 6 +++++-
 .../java/src/net/i2p/router/web/SummaryRenderer.java        | 6 +++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
index bbb03d2e8b..e8cd7e17b5 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
@@ -304,6 +304,7 @@ public class StatSummarizer implements Runnable {
         long period = 60*1000;
         long start = end - period*periodCount;
         //long begin = System.currentTimeMillis();
+        ImageOutputStream ios = null;
         try {
             RrdGraphDef def = new RrdGraphDef();
             def.setTimeSpan(start/1000, end/1000);
@@ -356,7 +357,7 @@ public class StatSummarizer implements Runnable {
             BufferedImage img = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_USHORT_565_RGB);
             Graphics gfx = img.getGraphics();
             graph.render(gfx);
-            ImageOutputStream ios = new MemoryCacheImageOutputStream(out);
+            ios = new MemoryCacheImageOutputStream(out);
             ImageIO.write(img, "png", ios);
 
             //File t = File.createTempFile("jrobinData", ".xml");
@@ -373,6 +374,9 @@ public class StatSummarizer implements Runnable {
         } catch (OutOfMemoryError oom) {
             _log.error("Error rendering", oom);
             throw new IOException("Error plotting: " + oom.getMessage());
+        } finally {
+            // this does not close the underlying stream
+            if (ios != null) try {ios.close();} catch (IOException ioe) {}
         }
     }
     
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java
index a0349aa711..2e0c44fed1 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java
@@ -99,6 +99,7 @@ class SummaryRenderer {
             periodCount = _listener.getRows();
         long start = end - (period * periodCount);
         //long begin = System.currentTimeMillis();
+        ImageOutputStream ios = null;
         try {
             RrdGraphDef def = new RrdGraphDef();
             def.setTimeSpan(start/1000, end/1000);
@@ -186,7 +187,7 @@ class SummaryRenderer {
             BufferedImage img = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_USHORT_565_RGB);
             Graphics gfx = img.getGraphics();
             graph.render(gfx);
-            ImageOutputStream ios = new MemoryCacheImageOutputStream(out);
+            ios = new MemoryCacheImageOutputStream(out);
             ImageIO.write(img, "png", ios);
             //System.out.println("Graph created");
 
@@ -203,6 +204,9 @@ class SummaryRenderer {
         } catch (OutOfMemoryError oom) {
             _log.error("Error rendering", oom);
             throw new IOException("Error plotting: " + oom.getMessage());
+        } finally {
+            // this does not close the underlying stream
+            if (ios != null) try {ios.close();} catch (IOException ioe) {}
         }
     }
 
-- 
GitLab