--- util/TransService.cpp.orig	2016-10-20 12:20:59.369457300 +0200
+++ util/TransService.cpp	2016-10-20 21:22:12.326778200 +0200
@@ -616,25 +616,31 @@ void TranscodeToStr::transcode(const XML
     ArrayJanitor<XMLByte> janString(fString, fMemoryManager);
 
     XMLSize_t charsDone = 0;
+    bool bufferExpanded = false;
 
     while(charsDone < len) {
         XMLSize_t charsRead = 0;
         fBytesWritten += trans->transcodeTo(in + charsDone, len - charsDone,
                                             fString + fBytesWritten, allocSize - fBytesWritten,
                                             charsRead, XMLTranscoder::UnRep_Throw);
-        if(charsRead == 0)
-            ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, fMemoryManager);
-
-        charsDone += charsRead;
-
-        if((allocSize - fBytesWritten) < ((len - charsDone) * sizeof(XMLCh)))
+        if (charsRead == 0)
         {
+            if (bufferExpanded)
+            {
+                ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, fMemoryManager);              
+            }
             allocSize *= 2;
             XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize);
             memcpy(newBuf, fString, fBytesWritten);
             fString = newBuf;
             janString.reset(fString, fMemoryManager);
-        }        
+            bufferExpanded = true;
+        }
+        else
+        {
+            charsDone += charsRead;
+            bufferExpanded = false;     
+        }
     }
 
     // null terminate
