Harmony
  1. Harmony
  2. HARMONY-67

java.nio.charset.Charset.decode(ByteBuffer) throws unexpected BufferOverflowException for UTF-16BE, UTF-16LE, UTF-16 charsets.

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: Classlib
    • Labels:
      None

      Description

      According to j2se 1.4.2 specification for Charset.decode(ByteBuffer b) the method must not throw any exceptions.
      The test listed below shows that there is unexpected BufferOverflowException thrown if charset name is one in the following: UTF-16BE, UTF-16LE, UTF-16.
      BEA does not throw any exceptions.

      Code to reproduce:
      import java.nio.charset.Charset;
      import java.nio.ByteBuffer;
      import java.nio.CharBuffer;
      public class test2 {
      public static void main(String[] args) throws Exception {
      byte[] b = new byte[]

      {(byte)1};
      ByteBuffer buf= ByteBuffer.wrap(b);
      CharBuffer charbuf=Charset.forName("UTF-16").decode(buf);
      System.out.println("CharBuffer.length()="+ charbuf.length());
      }
      }

      Steps to Reproduce:
      1. Build Harmony (check-out on 2006-01-30) j2se subset as described in README.txt.
      2. Compile test2.java using BEA 1.4 javac
      > javac -d . test2.java
      3. Run java using compatible VM (J9)
      > java -showversion test2

      Output:
      C:\tmp>C:\jrockit-j2sdk1.4.2_04\bin\java.exe -showversion test2
      java version "1.4.2_04"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)
      BEA WebLogic JRockit(TM) 1.4.2_04 JVM (build ari-31788-20040616-1132-win-ia32, Native Threads, GC strategy: parallel)
      CharBuffer.length()=0

      C:\tmp>C:\harmony\trunk\deploy\jre\bin\java -showversion test2
      (c) Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable.
      java.nio.BufferOverflowException
      at java.nio.CharBuffer.put(CharBuffer.java:662)
      at java.nio.CharBuffer.put(CharBuffer.java:629)
      at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:406)
      at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:243)
      at java.nio.charset.Charset.decode(Charset.java:630)
      at test2.main(test2.java:8)

      Suggested junit test case:
      ------------------------ CharsetTest.java -------------------------------------------------
      import java.nio.charset.Charset;
      import java.nio.ByteBuffer;
      import java.nio.CharBuffer;

      import junit.framework.*;

      public class CharsetTest extends TestCase {
      public static void main(String[] args) { junit.textui.TestRunner.run(CharsetTest.class); }
      public void test_decode() {
      byte[] b = new byte[] {(byte)1}

      ;
      ByteBuffer buf= ByteBuffer.wrap(b);
      CharBuffer charbuf=Charset.forName("UTF-16").decode(buf);
      assertEquals("Assert 0: charset UTF-16",0,charbuf.length());

      charbuf=Charset.forName("UTF-16BE").decode(buf);
      assertEquals("Assert 1: charset UTF-16BE",0, charbuf.length());

      charbuf=Charset.forName("UTF-16LE").decode(buf);
      assertEquals("Assert 2: charset UTF16LE",0, charbuf.length());

      }
      }

        Issue Links

          Activity

            People

            • Assignee:
              Tim Ellison
              Reporter:
              Svetlana Samoilenko
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development