Buffer overflow in ICULCPTranscoder::transcode
----------------------------------------------
Key: XERCESC-1319
URL: http://nagoya.apache.org/jira/browse/XERCESC-1319
Project: Xerces-C++
Type: Bug
Components: Utilities
Environment: All Platforms
Reporter: Alex R. Herbstritt
I have found a bug in the transcoder code when transcoding from UTF-16 to
UTF-8. We use Xerces against an in house library so I cannot include the code
that reproduces the bug. But the bug has been reproduced on Windows and HPUX32.
Instead I will give the details of the bug - along with the fix.
The bug is a buffer over run that happens in a very special case. The fix for
it is very simple. I find it hard to believe that nobody has seen this bug
before.
The problem is located in the file
xercesc/util/Transcoders/ICU/ICUTranService.cpp
in the method
XMLCh* ICULCPTranscoder::transcode(const char* const toTranscode)
with the function call ucnv_fromUChars:
targetCap = ucnv_fromUChars
(
fConverter
, retBuf
, targetLen + 1
, actualSrc
, -1
, &err
);
This is the function that is doing the actual conversion. The problem is with
the "targetLen + 1" - this should be replaced with "targetLen". (Note that the
call that follows has "targetCap", not "targetCap + 1".)
The problem is that ucnv_fromUChars can fill the buffer up, including the space
held for the null term. That is, targetCap is returned equaling targetLen+1,
along with a U_STRING_NOT_TERMINATED_WARNING. This is all fine, until the end
of the method where,
// Cap it off and return
retBuf[targetCap] = 0;
return retBuf;
will place the null term outside of the buffer. That is, we should never let
targetCap be larger than targetLen. (The buffer overflow will only happen when
targetCap==targetLen+1.)
Replacing "targetLen + 1" with "targetLen" results in a
U_BUFFER_OVERFLOW_ERROR. This is correct, because in the overflow case the
problem is that the new string created is one byte longer than the buffer that
was allocated. So we want the error to cause a new buffer to be allocated.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://nagoya.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]