Author: amassari
Date: Tue Jun 21 14:03:16 2011
New Revision: 1138012

URL: http://svn.apache.org/viewvc?rev=1138012&view=rev
Log:
TranscodeToStr and TranscodeFromStr threw exceptions when converting empty or 
special strings (XERCESC-1947)

Modified:
    xerces/c/trunk/src/xercesc/util/TransService.cpp
    xerces/c/trunk/src/xercesc/util/TransService.hpp
    xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp

Modified: xerces/c/trunk/src/xercesc/util/TransService.cpp
URL: 
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/TransService.cpp?rev=1138012&r1=1138011&r2=1138012&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/util/TransService.cpp (original)
+++ xerces/c/trunk/src/xercesc/util/TransService.cpp Tue Jun 21 14:03:16 2011
@@ -611,13 +611,13 @@ 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);
 
-    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,13 +626,14 @@ 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))
+               {
+                       allocSize *= 2;
+                       XMLByte *newBuf = 
(XMLByte*)fMemoryManager->allocate(allocSize);
+                       memcpy(newBuf, fString, fBytesWritten);
+                       fMemoryManager->deallocate(fString);
+                       fString = newBuf;
+               }
     }
 
     // null terminate
@@ -692,14 +693,18 @@ void TranscodeFromStr::transcode(const X
     XMLSize_t allocSize = length + 1;
     fString = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh));
 
-    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,26 +712,22 @@ 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));
+                       fMemoryManager->deallocate(fString);
+                       fString = newBuf;
+               }
     }
 
     // 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);
+        memcpy(newBuf, fString, fCharsWritten*sizeof(XMLCh));
         fMemoryManager->deallocate(fString);
         fString = newBuf;
     }

Modified: xerces/c/trunk/src/xercesc/util/TransService.hpp
URL: 
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/TransService.hpp?rev=1138012&r1=1138011&r2=1138012&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/util/TransService.hpp (original)
+++ xerces/c/trunk/src/xercesc/util/TransService.hpp Tue Jun 21 14:03:16 2011
@@ -634,7 +634,7 @@ private:
     //  fString
     //      The transcoded string
     //
-    //  fBytesWritten
+    //  fCharsWritten
     //      The length of the transcoded string in characters
     // -----------------------------------------------------------------------
     XMLCh *fString;

Modified: xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
URL: 
http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp?rev=1138012&r1=1138011&r2=1138012&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp (original)
+++ xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp Tue Jun 21 14:03:16 2011
@@ -33,14 +33,15 @@
 #include <xercesc/util/XMLException.hpp>
 #include <xercesc/util/XMLString.hpp>
 #include <xercesc/util/BinInputStream.hpp>
+#include <xercesc/util/regx/Match.hpp>
+#include <xercesc/util/TransService.hpp>
+#include <xercesc/util/OutOfMemoryException.hpp>
 #include <xercesc/parsers/XercesDOMParser.hpp>
 #include <xercesc/dom/DOMException.hpp>
 #include <xercesc/dom/DOMLSException.hpp>
 #include <xercesc/dom/DOMLSParserFilter.hpp>
-#include <xercesc/util/OutOfMemoryException.hpp>
 #include <xercesc/framework/MemBufInputSource.hpp>
 #include <xercesc/validators/common/CMStateSet.hpp>
-#include <xercesc/util/regx/Match.hpp>
 
 #define UNUSED(x) { if(x!=0){} }
 
@@ -5990,5 +5991,55 @@ bool DOMTest::testUtilFunctions()
         fprintf(stderr, "bitset test failed at line %i\n", __LINE__);
         OK = false;
     }
+
+       // TranscodeFrom/ToStr
+
+       const char* utf8 = "UTF-8";
+       char* empty = 
(char*)TranscodeToStr(XMLUni::fgZeroLenString,utf8).adopt(); 
+       if(XMLString::stringLen(empty)!=0)
+       {
+        fprintf(stderr, "TranscodeToStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLCh* empty2 = 
TranscodeFromStr((XMLByte*)empty,strlen(empty),utf8).adopt(); 
+       if(XMLString::stringLen(empty2)!=0)
+       {
+        fprintf(stderr, "TranscodeFromStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLString::release(&empty);
+       XMLString::release(&empty2);
+
+       const XMLCh aval [] = { 0x0041, 0x0000}; //LATIN CAPITAL LETTER A
+       char* ac = (char*)TranscodeToStr(aval,utf8).adopt(); 
+       if(!XMLString::equals(ac, "A"))
+       {
+        fprintf(stderr, "TranscodeToStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLCh* ac2=TranscodeFromStr((XMLByte*)ac, strlen(ac), utf8).adopt();
+       if(!XMLString::equals(ac2, aval))
+       {
+        fprintf(stderr, "TranscodeFromStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLString::release(&ac);
+       XMLString::release(&ac2);
+       const XMLCh uval [] = { 0x254B, 0x0000}; //BOX DRAWINGS HEAVY VERTICAL 
AND HORIZONTAL (needs 3 bytes for utf-8)
+       char* uc = (char*)TranscodeToStr(uval,utf8).adopt(); 
+       if(!XMLString::equals(uc, "\xE2\x95\x8B"))
+       {
+        fprintf(stderr, "TranscodeToStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLCh* uc2=TranscodeFromStr((XMLByte*)uc, strlen(uc), utf8).adopt();
+       if(!XMLString::equals(uc2, uval))
+       {
+        fprintf(stderr, "TranscodeFromStr failed at line %i\n", __LINE__);
+        OK = false;
+       }
+       XMLString::release(&uc);
+       XMLString::release(&uc2);
+
     return OK;
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to