Details
Description
This issue relates to the bug fix for issue XERCESC-1947. There are still cases where the method will fail in providing a transcoded version without throwing an exception. See the attached "transtest2.cpp" to reproduce the issue.
The cause seems to come from the added "if((allocSize - fBytesWritten) < (len - charsDone))" condition in "TranscodeToStr::transcode" . In my provided test case I have a string composed of 6 Japanese characters (i.e. "絞り込み検索"). Once the first call to "XMLUTF8Transcoder::transcodeTo" is done, "charsRead" will return a count of 5 XMLCh readed. Since the initial allocated buffer for this string was set to 16 bytes, the condition will check against the following values "if((16 - 15) < (6 - 5))" which avoids the reallocation of a larger buffer for the UTF-8 encoded version of the string.
Since the reallocation doesn't take place, the code will recall "XMLUTF8Transcoder::transcodeTo" but this time the "charsRead" count will be set to 0 because there is insufficient space in the buffer and this will trigger an exception of type "Trans_BadSrcSeq".
I suppose that the goal of this added condition was to avoid an unnecessary reallocation of a buffer but unfortunately it doesn’t work when transcoding to variable length encoding like UTF-8. The solution is probably to simply replace the condition with "if(charsDone < len)".
Regards,
Dan
Attachments
Attachments
Issue Links
- is related to
-
XERCESC-1947 XMLUTF8Transcoder::transcodeTo fails with an exception when transcoding single characters that require 3 or more bytes as UTF8.
- Closed
- relates to
-
XERCESC-1987 Transcoding Issue with single XMLCh to utf8
- Closed