From 4d3d7994a558e4930e3e49b3af30e9fe4ab02bde Mon Sep 17 00:00:00 2001
From: Boris Kolpackov <borisk@apache.org>
Date: Sun, 18 Apr 2010 15:39:46 +0000
Subject: [PATCH] Recover from the mismatching start/end even count which may
 happen when we continue parsing a invalid document (XERCESC-1919).

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@935357 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/parsers/AbstractDOMParser.cpp | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index 7b4129343..7a9c25b79 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -24,8 +24,6 @@
 *
 */
 
-
-
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
@@ -853,6 +851,15 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl&)
     fCurrentNode   = fCurrentParent;
     fCurrentParent = fCurrentNode->getParentNode ();
 
+    // When the document is invalid but we continue parsing, we may
+    // end up seeing more 'end' events than the 'start' ones.
+    //
+    if (fCurrentParent == 0 && fDocument != 0)
+    {
+      fCurrentNode = fDocument->getDocumentElement ();
+      fCurrentParent = fCurrentNode;
+    }
+
     if (erImpl)
         erImpl->setReadOnly(true, true);
 }
@@ -866,6 +873,15 @@ void AbstractDOMParser::endElement( const   XMLElementDecl&
     fCurrentNode   = fCurrentParent;
     fCurrentParent = fCurrentNode->getParentNode ();
 
+    // When the document is invalid but we continue parsing, we may
+    // end up seeing more 'end' events than the 'start' ones.
+    //
+    if (fCurrentParent == 0 && fDocument != 0)
+    {
+      fCurrentNode = fDocument->getDocumentElement ();
+      fCurrentParent = fCurrentNode;
+    }
+
     // If we've hit the end of content, clear the flag.
     //
     if (fCurrentParent == fDocument)
-- 
GitLab