summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Pipping <sebastian@pipping.org>2022-09-22 16:51:17 +0200
committerSebastian Pipping <sebastian@pipping.org>2022-10-07 19:30:10 +0200
commit16a4db928bc75d93e798abb47c0b6696eef3355b (patch)
treeacd6d433dd9c2267e05d087bba6e874958a87404
parentd7ea13f504a93c90e4b711bd3fc02b29a5380451 (diff)
downloadlibexpat-git-16a4db928bc75d93e798abb47c0b6696eef3355b.tar.gz
lib: Stop leaking opening tag bindings after closing tag mismatch error
.. by moving the opening tag onto the free tag list only *after* the tag match check has passed.
-rw-r--r--expat/lib/xmlparse.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/expat/lib/xmlparse.c b/expat/lib/xmlparse.c
index 5e2c16b2..e415068b 100644
--- a/expat/lib/xmlparse.c
+++ b/expat/lib/xmlparse.c
@@ -3011,9 +3011,6 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
int len;
const char *rawName;
TAG *tag = parser->m_tagStack;
- parser->m_tagStack = tag->parent;
- tag->parent = parser->m_freeTagList;
- parser->m_freeTagList = tag;
rawName = s + enc->minBytesPerChar * 2;
len = XmlNameLength(enc, rawName);
if (len != tag->rawNameLength
@@ -3021,6 +3018,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
*eventPP = rawName;
return XML_ERROR_TAG_MISMATCH;
}
+ parser->m_tagStack = tag->parent;
+ tag->parent = parser->m_freeTagList;
+ parser->m_freeTagList = tag;
--parser->m_tagLevel;
if (parser->m_endElementHandler) {
const XML_Char *localPart;