Author: scantor
Date: Sat Feb 28 02:16:39 2015
New Revision: 1662885
URL: http://svn.apache.org/r1662885
Log:
XERCESC-1974,XERCESC-1984
Modified:
xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.cpp
xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.hpp
Modified: xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.cpp
URL:
http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.cpp?rev=1662885&r1=1662884&r2=1662885&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.cpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.cpp Sat Feb 28
02:16:39 2015
@@ -611,13 +611,14 @@ void TranscodeToStr::transcode(const XML
{
if(!in) return;
- XMLSize_t allocSize = len * sizeof(XMLCh);
+ XMLSize_t allocSize = (len * sizeof(XMLCh)) + 4;
fString = (XMLByte*)fMemoryManager->allocate(allocSize);
+ ArrayJanitor<XMLByte> janString(fString, fMemoryManager);
- XMLSize_t charsRead = 0;
XMLSize_t charsDone = 0;
- while(true) {
+ while(charsDone < len) {
+ XMLSize_t charsRead = 0;
fBytesWritten += trans->transcodeTo(in + charsDone, len - charsDone,
fString + fBytesWritten, allocSize
- fBytesWritten,
charsRead,
XMLTranscoder::UnRep_Throw);
@@ -626,27 +627,32 @@ void TranscodeToStr::transcode(const XML
charsDone += charsRead;
- if(charsDone == len) break;
-
- allocSize *= 2;
- XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize);
- memcpy(newBuf, fString, fBytesWritten);
- fMemoryManager->deallocate(fString);
- fString = newBuf;
+ if((allocSize - fBytesWritten) < ((len - charsDone) * sizeof(XMLCh)))
+ {
+ allocSize *= 2;
+ XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize);
+ memcpy(newBuf, fString, fBytesWritten);
+ fString = newBuf;
+ janString.reset(fString, fMemoryManager);
+ }
}
// null terminate
- if((fBytesWritten + 4) > allocSize) {
+ if ((fBytesWritten + 4) > allocSize)
+ {
allocSize = fBytesWritten + 4;
XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize);
memcpy(newBuf, fString, fBytesWritten);
- fMemoryManager->deallocate(fString);
fString = newBuf;
+ janString.reset(fString, fMemoryManager);
}
fString[fBytesWritten + 0] = 0;
fString[fBytesWritten + 1] = 0;
fString[fBytesWritten + 2] = 0;
fString[fBytesWritten + 3] = 0;
+
+ // Leave fString with ownership of the buffer
+ janString.release();
}
// ---------------------------------------------------------------------------
@@ -691,15 +697,20 @@ void TranscodeFromStr::transcode(const X
XMLSize_t allocSize = length + 1;
fString = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh));
+ ArrayJanitor<XMLCh> janString(fString, fMemoryManager);
- XMLSize_t csSize = length;
+ XMLSize_t csSize = allocSize;
ArrayJanitor<unsigned char> charSizes((unsigned
char*)fMemoryManager->allocate(csSize * sizeof(unsigned char)),
fMemoryManager);
- XMLSize_t bytesRead = 0;
XMLSize_t bytesDone = 0;
- while(true) {
+ while(bytesDone < length) {
+ if ((allocSize - fCharsWritten) > csSize) {
+ csSize = allocSize - fCharsWritten;
+ charSizes.reset((unsigned char*)fMemoryManager->allocate(csSize *
sizeof(unsigned char)), fMemoryManager);
+ }
+ XMLSize_t bytesRead = 0;
fCharsWritten += trans->transcodeFrom(in + bytesDone, length -
bytesDone,
fString + fCharsWritten,
allocSize - fCharsWritten,
bytesRead, charSizes.get());
@@ -707,30 +718,30 @@ void TranscodeFromStr::transcode(const X
ThrowXMLwithMemMgr(TranscodingException,
XMLExcepts::Trans_BadSrcSeq, fMemoryManager);
bytesDone += bytesRead;
- if(bytesDone == length) break;
-
- allocSize *= 2;
- XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize *
sizeof(XMLCh));
- memcpy(newBuf, fString, fCharsWritten);
- fMemoryManager->deallocate(fString);
- fString = newBuf;
- if((allocSize - fCharsWritten) > csSize) {
- csSize = allocSize - fCharsWritten;
- charSizes.reset((unsigned char*)fMemoryManager->allocate(csSize *
sizeof(unsigned char)),
- fMemoryManager);
+ if (((allocSize - fCharsWritten)*sizeof(XMLCh)) < (length - bytesDone))
+ {
+ allocSize *= 2;
+ XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize *
sizeof(XMLCh));
+ memcpy(newBuf, fString, fCharsWritten*sizeof(XMLCh));
+ fString = newBuf;
+ janString.reset(fString, fMemoryManager);
}
}
// null terminate
- if(fCharsWritten == allocSize) {
- allocSize += 1;
+ if ((fCharsWritten + 1) > allocSize)
+ {
+ allocSize = fCharsWritten + 1;
XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize *
sizeof(XMLCh));
- memcpy(newBuf, fString, fCharsWritten);
- fMemoryManager->deallocate(fString);
+ memcpy(newBuf, fString, fCharsWritten*sizeof(XMLCh));
fString = newBuf;
+ janString.reset(fString, fMemoryManager);
}
fString[fCharsWritten] = 0;
+
+ // Leave fString with ownership of the buffer
+ janString.release();
}
XERCES_CPP_NAMESPACE_END
Modified: xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.hpp
URL:
http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.hpp?rev=1662885&r1=1662884&r2=1662885&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.hpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/util/TransService.hpp Sat Feb 28
02:16:39 2015
@@ -634,7 +634,7 @@ private:
// fString
// The transcoded string
//
- // fBytesWritten
+ // fCharsWritten
// The length of the transcoded string in characters
// -----------------------------------------------------------------------
XMLCh *fString;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]