diff --git a/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java b/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java index 3ddb15a59..295a0278f 100644 --- a/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java +++ b/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java @@ -85,10 +85,17 @@ public class DecodingOutputStream extends OutputStream { // So just check if we got a character back in the buffer. if (result == null || (result.isError() && !_cb.hasRemaining())) { _out.write(REPLACEMENT); + // need to do this or we will infinite loop + ((Buffer)_bb).clear(); } else { ((Buffer)_cb).flip(); _out.append(_cb); ((Buffer)_cb).clear(); + if (result.isError()) { + _out.write(REPLACEMENT); + // need to do this or we will infinite loop + ((Buffer)_bb).clear(); + } } } @@ -107,7 +114,7 @@ public class DecodingOutputStream extends OutputStream { public static void main(String[] args) { try { String s = "Consider the encoding of the Euro sign, €." + - " The Unicode code point for \"€\" is U+20AC."; + " The Unicode code point for \"€\" is U+20AC.\n"; StringBuilder buf = new StringBuilder(); for (int i = 0; i < 100; i++) { buf.append(s); @@ -118,10 +125,13 @@ public class DecodingOutputStream extends OutputStream { Writer w = new StringBuilderWriter(); DecodingOutputStream r = new DecodingOutputStream(w, "UTF-8"); int b; - while ((b = bais.read()) >= 0) { - r.write(b); + byte[] bf = new byte[256]; + int rand = 1 + net.i2p.I2PAppContext.getGlobalContext().random().nextInt(256); + while ((b = bais.read(bf, 0, rand)) >= 0) { + r.write(bf, 0, b); + rand = 1 + net.i2p.I2PAppContext.getGlobalContext().random().nextInt(256); } - r.flush(); + r.close(); System.out.println("Received: \"" + w.toString() + '"'); System.out.println("Test passed? " + w.toString().equals(s)); bais = new java.io.ByteArrayInputStream(new byte[] { 'x', (byte) 0xcc, 'x' } ); @@ -130,7 +140,7 @@ public class DecodingOutputStream extends OutputStream { while ((b = bais.read()) >= 0) { r.write(b); } - r.flush(); + r.close(); System.out.println("Received: \"" + w.toString() + '"'); } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java b/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java index ce49426b2..674feaaf0 100644 --- a/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java +++ b/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java @@ -47,7 +47,7 @@ public class StringBuilderWriter extends Writer { @Override public void write(int c) { - buf.append(c); + buf.append((char) c); } @Override diff --git a/history.txt b/history.txt index 631328802..fe310cdd0 100644 --- a/history.txt +++ b/history.txt @@ -1,10 +1,13 @@ 2021-04-24 zzz * Jetty: Patch for CVE-2021-28165 Jetty #6072 - Jetty server high CPU when client send data length > 17408 + * SusiMail: Fix infinite loop in decoder on malformed input 2021-04-24 zlatinb - * SusiMail: Fix stream closed exception reading new mail - (trac ticket #2202, gitlab ticket #17) + * SusiMail: + - Fix stream closed exception reading new mail + (trac ticket #2202, gitlab ticket #17) + - Fix corruption of large messages (ticket #2765) 2021-04-23 idk * Router: Fix update on Windows from very old versions (gitlab ticket #16) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 2f628a65d..ad00f8fca 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Git"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 14; + public final static long BUILD = 15; /** for example "-test" */ public final static String EXTRA = "";