harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paulex Yang (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HARMONY-33) java.nio.BufferOverflow exception while decoding ByteBuffer with UTF-16 charset
Date Wed, 18 Jan 2006 06:55:05 GMT
    [ http://issues.apache.org/jira/browse/HARMONY-33?page=comments#action_12363077 ] 

Paulex Yang commented on HARMONY-33:

I agree with the cause, and the fix seems reasonable, but when I tried to apply the fix ,
and ran the test provided,  it throws another exception like this:
	at java.nio.charset.CharsetDecoder.flush(CharsetDecoder.java:516)
	at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:244)
	at bugtests.Harmony33.main(Harmony33.java:15)

Looking further into the CharsetDecoder.decode(ByteBuffer), I found the decode(ByteBuffer)
implements a whole decode procedure, which includes several steps, just as the JavaDoc said(I
copied it here):
a decoding operation:
 * Invoking the reset() method to reset the decoder if the decoder has been used;
 * Invoking the decode(ByteBuffer, CharBuffer, boolean)  method until the addtional input
is not needed, the code>endOfInput parameter must be set to false, the input buffer must
be filled and the output buffer must be flushed between invocations;
 * Invoking the decode(ByteBuffer, CharBuffer, boolean) method last time, and the the endOfInput
parameter must be set to true
 * Invoking the flush(CharBuffer) method to flush the output.

So it will end the decode procedure by flush(CharBuffer). And the flush() method will throw
java.lang.IllegalStateException unless the CharsetDecoder's is in END or INIT status, the
relevant code is like this:
    public final CoderResult flush(CharBuffer out) {
        if (status != END && status != INIT) {
            throw new IllegalStateException();

Now let's look back the original fix again, it return the CoderResult.OVERFLOW directly without
change the CharDecoder's status so that the following flush() method will throw exception.
A better alternatives to this fix is:
if(out.remaining() < replace.length() ) {
 result  = CoderResult.OVERFLOW;
} else{

So that it will then break out of the while loop, set the status, and return. Test shows it
will exit normally. 

P.S. I'm still suspicous about the alternative fix in fact, because in some case the replace
character isn't really insert into the output CharBuffer, I'm not sure if it is correct behaviour
and I will study it with more tests later:). 

> 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)
> 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:
For more information on JIRA, see:

View raw message