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]

Reply via email to