[ 
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

Reply via email to