src/share/classes/sun/nio/cs/UTF_8.java

Print this page

        

*** 109,124 **** private static boolean isMalformed4(int b2, int b3, int b4) { return (b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80 || (b4 & 0xc0) != 0x80; } ! // only used when there is less than 4 bytes left in src buffer private static boolean isMalformed4_2(int b1, int b2) { ! return (b1 == 0xf0 && b2 == 0x90) || (b2 & 0xc0) != 0x80; } private static boolean isMalformed4_3(int b3) { return (b3 & 0xc0) != 0x80; } private static CoderResult lookupN(ByteBuffer src, int n) --- 109,128 ---- private static boolean isMalformed4(int b2, int b3, int b4) { return (b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80 || (b4 & 0xc0) != 0x80; } ! // only used when there is less than 4 bytes left in src buffer. ! // both b1 and b2 should be "& 0xff" before passed in. private static boolean isMalformed4_2(int b1, int b2) { ! return (b1 == 0xf0 && (b2 < 0x90 || b2 > 0xbf)) || ! (b1 == 0xf4 && (b2 & 0xf0) != 0x80) || (b2 & 0xc0) != 0x80; } + // only used when there is less than 4 bytes left in src buffer, + // after isMalformed4_2 has been invoked. private static boolean isMalformed4_3(int b3) { return (b3 & 0xc0) != 0x80; } private static CoderResult lookupN(ByteBuffer src, int n)
*** 278,288 **** sp += 3; } else if ((b1 >> 3) == -2) { // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx int srcRemaining = sl - sp; if (srcRemaining < 4 || dl - dp < 2) { ! if (srcRemaining > 1 && isMalformed4_2(b1, sa[sp + 1])) return malformedForLength(src, sp, dst, dp, 1); if (srcRemaining > 2 && isMalformed4_3(sa[sp + 2])) return malformedForLength(src, sp, dst, dp, 2); return xflow(src, sp, sl, dst, dp, 4); } --- 282,294 ---- sp += 3; } else if ((b1 >> 3) == -2) { // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx int srcRemaining = sl - sp; if (srcRemaining < 4 || dl - dp < 2) { ! b1 &= 0xff; ! if (b1 > 0xf4 || ! srcRemaining > 1 && isMalformed4_2(b1, sa[sp + 1] & 0xff)) return malformedForLength(src, sp, dst, dp, 1); if (srcRemaining > 2 && isMalformed4_3(sa[sp + 2])) return malformedForLength(src, sp, dst, dp, 2); return xflow(src, sp, sl, dst, dp, 4); }
*** 361,371 **** mark += 3; } else if ((b1 >> 3) == -2) { // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx int srcRemaining = limit - mark; if (srcRemaining < 4 || dst.remaining() < 2) { ! if (srcRemaining > 1 && isMalformed4_2(b1, src.get())) return malformedForLength(src, mark, 1); if (srcRemaining > 2 && isMalformed4_3(src.get())) return malformedForLength(src, mark, 2); return xflow(src, mark, 4); } --- 367,379 ---- mark += 3; } else if ((b1 >> 3) == -2) { // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx int srcRemaining = limit - mark; if (srcRemaining < 4 || dst.remaining() < 2) { ! b1 &= 0xff; ! if (b1 > 0xf4 || ! srcRemaining > 1 && isMalformed4_2(b1, src.get() & 0xff)) return malformedForLength(src, mark, 1); if (srcRemaining > 2 && isMalformed4_3(src.get())) return malformedForLength(src, mark, 2); return xflow(src, mark, 4); }
*** 516,527 **** } continue; } if (malformedInputAction() != CodingErrorAction.REPLACE) return -1; ! ! if (sp < sl && isMalformed4_2(b1, sa[sp])) { da[dp++] = replacement().charAt(0); continue; } sp++; if (sp < sl && isMalformed4_3(sa[sp])) { --- 524,536 ---- } continue; } if (malformedInputAction() != CodingErrorAction.REPLACE) return -1; ! b1 &= 0xff; ! if (b1 > 0xf4 || ! sp < sl && isMalformed4_2(b1, sa[sp] & 0xff)) { da[dp++] = replacement().charAt(0); continue; } sp++; if (sp < sl && isMalformed4_3(sa[sp])) {