[ http://issues.apache.org/jira/browse/HARMONY-33?page=comments#action_12363005 ]
Vladimir Strigun commented on HARMONY-33: ----------------------------------------- The reason of the issue is invocation of put(replacement) method for CharBuffer with zero capacity. First, during decoding byte buffer, char buffer should be created with initial capacity equals to remaining bytes in byte buffer multiplied by average chars per byte value. For the current testcase initial capacity for char buffer is 0 ( int length = (int) (in.remaining() * averChars) ). And when CodingErrorAction = CodingErrorAction.REPLACE decoder try to put replacement string to zero-sized char buffer. Please review fix for the issue (diff for revision 367369 of /incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/CharsetDecoder.java): 405a406,408 > if(out.remaining() < replace.length() ) { > return CoderResult.OVERFLOW; > } 407d409 < continue; > java.nio.BufferOverflow exception while decoding ByteBuffer with UTF-16 > charset > ------------------------------------------------------------------------------- > > Key: HARMONY-33 > URL: http://issues.apache.org/jira/browse/HARMONY-33 > Project: Harmony > Type: Bug > Components: Classlib > Reporter: Vladimir Strigun > Assignee: Geir Magnusson Jr > Priority: Minor > > If I try to decode ByteBuffer with lengh 1 using UTF-16 decoder unexpected > java.nio.BufferOverflow exception occured. Please see testcase below. > import java.nio.*; > import java.nio.charset.*; > import junit.framework.TestCase; > public class TestDecoder extends TestCase { > public static void main(String[] args) { > junit.textui.TestRunner.run(TestDecoder.class); > } > public static void testDecoder(){ > try{ > ByteBuffer bb = ByteBuffer.allocate(1); > bb.put(0,(byte)77); > CharsetDecoder utf16D = Charset.forName("UTF-16").newDecoder(); > CharBuffer cb = > utf16D.onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE).decode(bb); > }catch(Exception e){ > fail("Exception occured: "+e); > } > } > } > Output on RI: > . > Time: 0,03 > OK (1 test) > Output with Harmony: > .F > Time: 0,01 > There was 1 failure: > 1) testDecoder(TestDecoder)junit.framework.AssertionFailedError: Exception > occured: java.nio.BufferOverflowException > at TestDecoder.testDecoder(TestDecoder.java:20) > at > java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:211) > at TestDecoder.main(TestDecoder.java:10) > FAILURES!!! > Tests run: 1, Failures: 1, Errors: 0 -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira