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