diff -r ccf9d86e52ec -r 4996a75e8bfb jdk/src/java.base/share/classes/sun/nio/cs/SingleByte.java --- a/jdk/src/java.base/share/classes/sun/nio/cs/SingleByte.java Fri Feb 06 15:42:07 2015 -0800 +++ b/jdk/src/java.base/share/classes/sun/nio/cs/SingleByte.java Mon Feb 09 11:37:56 2015 -0800 @@ -160,22 +160,18 @@ byte[] da = dst.array(); int dp = dst.arrayOffset() + dst.position(); int dl = dst.arrayOffset() + dst.limit(); + int len = Math.min(dl - dp, sl - sp); - CoderResult cr = CoderResult.UNDERFLOW; - if ((dl - dp) < (sl - sp)) { - sl = sp + (dl - dp); - cr = CoderResult.OVERFLOW; - } - - while (sp < sl) { + while (len-- > 0) { char c = sa[sp]; int b = encode(c); if (b == UNMAPPABLE_ENCODING) { if (Character.isSurrogate(c)) { if (sgp == null) sgp = new Surrogate.Parser(); - if (sgp.parse(c, sa, sp, sl) < 0) + if (sgp.parse(c, sa, sp, sl) < 0) { return withResult(sgp.error(), src, sp, dst, dp); + } return withResult(sgp.unmappableResult(), src, sp, dst, dp); } return withResult(CoderResult.unmappableForLength(1), @@ -184,7 +180,8 @@ da[dp++] = (byte)b; sp++; } - return withResult(cr, src, sp, dst, dp); + return withResult(sp < sl ? CoderResult.OVERFLOW : CoderResult.UNDERFLOW, + src, sp, dst, dp); } private CoderResult encodeBufferLoop(CharBuffer src, ByteBuffer dst) {