--- old/src/share/classes/sun/nio/cs/ext/GB18030.java 2019-02-25 17:18:41.368457215 +0100 +++ new/src/share/classes/sun/nio/cs/ext/GB18030.java 2019-02-25 17:18:41.272457157 +0100 @@ -12518,7 +12518,7 @@ dst.put(getChar(offset)); else if (offset >= 0x830D && offset <= 0x93A8) dst.put((char)(offset + 0x6557)); - else if (offset >= 0x93A9 && offset <= 0x99F9) + else if (offset >= 0x93A9 && offset <= 0x99FB) dst.put(getChar(offset)); // Supplemental UCS planes handled via surrogates else if (offset >= 0x2E248 && offset < 0x12E248) { --- old/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java 2019-02-25 17:18:41.948457565 +0100 +++ new/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java 2019-02-25 17:18:41.856457510 +0100 @@ -309,7 +309,7 @@ break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } da[dp++] = (char)(b1 + 0xff40); @@ -430,7 +430,7 @@ break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } dst.put((char)(b1 + 0xff40)); --- old/test/sun/nio/cs/TestISO2022JP.java 2019-02-25 17:18:42.452457870 +0100 +++ new/test/sun/nio/cs/TestISO2022JP.java 2019-02-25 17:18:42.360457814 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ /* @test - @bug 4626545 4879522 4913711 4119445 + @bug 4626545 4879522 4913711 4119445 8211382 @summary Check full coverage encode/decode for ISO-2022-JP */ @@ -608,5 +608,18 @@ if (encoded[i] != expected[i]) throw new Exception("ISO-2022-JP Decoder error"); } + + // Test for 11 iso2022jp decoder + encoded = new byte[] { + (byte)0x1B, (byte)0x28, (byte)0x49, (byte)0x60, + (byte)0x1B, (byte)0x28, (byte)0x42, + }; + String unexpectedStr = "\uffa0"; + String expectedStr = "\ufffd"; + if (new String(encoded, "ISO2022JP").equals(unexpectedStr)) { + throw new Exception("ISO2022JP Decoder error: \\uFFA0"); + } else if (!new String(encoded, "ISO2022JP").equals(expectedStr)) { + throw new Exception("ISO2022JP Decoder error: \\uFFFD"); + } } } --- /dev/null 2019-02-05 12:34:35.532619860 +0100 +++ new/test/sun/nio/cs/TestGB18030.java 2019-02-25 17:18:42.864458118 +0100 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8211382 + * @summary Check GB18030 + * @modules jdk.charsets + */ + +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestGB18030 { + public static void gb18030_1(boolean useDirect) throws Exception { + for(char ch : new char[]{'\uFFFE', '\uFFFF'}) { + char[] ca = new char[]{ch}; + Charset cs = Charset.forName("GB18030"); + CharsetEncoder ce = cs.newEncoder(); + CharsetDecoder cd = cs.newDecoder(); + CharBuffer cb = CharBuffer.wrap(ca); + ByteBuffer bb; + if (useDirect) { + bb = ByteBuffer.allocateDirect( + (int)Math.ceil(ce.maxBytesPerChar())); + } else { + bb = ByteBuffer.allocate( + (int)Math.ceil(ce.maxBytesPerChar())); + } + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) { + throw new RuntimeException( + String.format("Encoder Error: \\u%04X: direct=%b: %s", + (int)ch, + useDirect, + cr.toString())); + } + bb.position(0); + cb = CharBuffer.allocate((int)Math.ceil( + cd.maxCharsPerByte()*bb.limit())); + cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) { + throw new RuntimeException( + String.format("Decoder Error: \\u%04X: direct=%b: %s", + (int)ch, + useDirect, + cr.toString())); + } + if (ca[0] != cb.get(0)) { + throw new RuntimeException( + String.format("direct=%b: \\u%04X <> \\u%04X", + useDirect, + (int)ca[0], + (int)cb.get(0))); + } + } + } + public static void main(String args[]) throws Exception { + gb18030_1(false); + gb18030_1(true); + } +}