[
https://issues.apache.org/jira/browse/XERCESC-1947?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12919245#action_12919245
]
Ben Griffin commented on XERCESC-1947:
--------------------------------------
XMLUTF8Transcoder::transcodeTo() names it's fifth character 'charsEaten', and
returns the value of just how many characters were successfully transcoded
before hitting the end-buffer.
However, TranscodeToStr::transcode() calls transcodeTo with the same parameter
named as 'charsRead', and expects a value greater than zero. This is clearly a
mistake, as a single character that requires more than one byte will not be
eaten, even though it was 'read'.
As I see it, the Throw at line 624 of TransService.cpp is unnecessary. There
are obviously cases where there are no characters 'read' because there isn't
enough memory to read them yet. The Transservice should be able to rely upon
the transcodeTo() method to handle exceptions, rather than just be 'surprised'
at what it gets back.
Therefore, there is no error when no bytes are 'read' - instead the memory
should be increased and the transcoding should continue.
OTOH, it seems reasonable for transcode() to test for a zero length string
before callint transcodeTo().
Just my humble 2ยข.
> XMLUTF8Transcoder::transcodeTo fails with an exception when transcoding
> single characters that require 3 or more bytes as UTF8.
> --------------------------------------------------------------------------------------------------------------------------------
>
> Key: XERCESC-1947
> URL: https://issues.apache.org/jira/browse/XERCESC-1947
> Project: Xerces-C++
> Issue Type: Bug
> Affects Versions: 3.1.0, 3.1.1
> Environment: Tested on mac os and debian linux. The failure is only
> manifest on v3.1.x
> Reporter: Ben Griffin
> Priority: Critical
> Attachments: transtest.cpp
>
>
> This can be demonstrated with the following 2 lines of code.
> const XMLCh uval [] = { 0x254B, 0x0000}; //BOX DRAWINGS HEAVY VERTICAL
> AND HORIZONTAL (needs 3 bytes for utf-8)
> char* uc = (char*)TranscodeToStr(uval,"UTF-8").adopt(); cout << uc <<
> endl << flush; XMLString::release(&uc); //faulty exception;
> The error is: "terminate called after throwing an instance of
> 'xercesc_3_1::TranscodingException'"
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]