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]

Reply via email to