[ 
https://issues.apache.org/jira/browse/DIRMINA-1181?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17885305#comment-17885305
 ] 

Pete Disdale edited comment on DIRMINA-1181 at 9/27/24 12:30 PM:
-----------------------------------------------------------------

Thanks for the prompt fix Emmanuel - much appreciated.  Out of curiosity I have 
been experimenting with your initial suggested solution and think that if you 
change:
{code:java}
return new String(buf().array(), 0, remaining(), decoder.charset());{code}
to
{code:java}
String decoded = new String(buf().array(), 0, remaining(), decoder.charset());
       int nulpos = decoded.indexOf((char) 0);
return nulpos < 0 ? decoded : decoded.substring(0, nulpos);
{code}
 

I think it might work. However this is a much bigger change than your single 
"i++" addition so would require a lot of regression testing!

I much prefer your (safer!) fix.

Thanks again,

Pete

 

p.s. Also simply truncating the string at the first NUL character to get the 
desired result will potentially lose anything further along the buffer. I do 
not pretend to understand the internal workings of getString() as the code is 
not an easy read but suppose that in addition to returning the desired result, 
the head/tail pointers in the IoBuffer or ByteBuffer should also be left in the 
correct state for the next getString().


was (Author: JIRAUSER307131):
Thanks for the prompt fix Emmanuel - much appreciated.  Out of curiosity I have 
been experimenting with your initial suggested solution and think that if you 
change:
{code:java}
return new String(buf().array(), 0, remaining(), decoder.charset());{code}

to
{code:java}
String decoded = new String(buf().array(), 0, remaining(), decoder.charset());
       int nulpos = decoded.indexOf((char) 0);
return nulpos < 0 ? decoded : decoded.substring(0, nulpos);
{code}
 

I think it migh work. However this is a much bigger change than your single 
"i++" addition so would require a lot of regression testing!

I much prefer your (safer!) fix.

Thanks again,

Pete

> Exception thrown when attempting to decode certain UTF16 chars
> --------------------------------------------------------------
>
>                 Key: DIRMINA-1181
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1181
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.1.6
>         Environment: Linux, Windows, Java 8, Java 17
>            Reporter: Pete Disdale
>            Priority: Major
>         Attachments: MacronTest-1.java, MacronTest.java
>
>
> When trying to decode a UTF16BE input stream containing characters ot the 
> form \uxx00, for example \u0100 (capital A with macron) the method 
> *AbstractIoBuffer.getString(CharsetDecoder)* incorrectly interprets the 
> second byte as a null terminator (causing a 
> java.nio.charset.MalformedInputException to be thrown) despite this null byte 
> being mid-character (at an odd index). The attached file, MacronTest, 
> demonstrates the issue and when run produces the following output:
> buf = ABC
> Exception in thread "main" java.nio.charset.MalformedInputException: Input 
> length = 1
>     at 
> java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
>     at 
> org.apache.mina.core.buffer.AbstractIoBuffer.getString(AbstractIoBuffer.java:1669)
>     at MacronTest.<init>(MacronTest.java:61)
>     at MacronTest.main(MacronTest.java:13)
> It looks like this issue is also in the 2.2.X branch (3.X/trunk not checked).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to