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]