diff --git a/parser.c b/parser.c index da6e7292..b6e99b1d 100644 --- a/parser.c +++ b/parser.c @@ -94,6 +94,8 @@ static xmlParserCtxtPtr xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, const xmlChar *base, xmlParserCtxtPtr pctx); +static void xmlHaltParser(xmlParserCtxtPtr ctxt); + /************************************************************************ * * * Arbitrary limits set in the parser. See XML_PARSE_HUGE * @@ -12624,6 +12626,33 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, } #endif /* LIBXML_PUSH_ENABLED */ +/** + * xmlHaltParser: + * @ctxt: an XML parser context + * + * Blocks further parser processing don't override error + * for internal use + */ +static void +xmlHaltParser(xmlParserCtxtPtr ctxt) { + if (ctxt == NULL) + return; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + if (ctxt->input != NULL) { + /* + * in case there was a specific allocation deallocate before + * overriding base + */ + if (ctxt->input->free != NULL) { + ctxt->input->free((xmlChar *) ctxt->input->base); + ctxt->input->free = NULL; + } + ctxt->input->cur = BAD_CAST""; + ctxt->input->base = ctxt->input->cur; + } +} + /** * xmlStopParser: * @ctxt: an XML parser context @@ -12634,13 +12663,8 @@ void xmlStopParser(xmlParserCtxtPtr ctxt) { if (ctxt == NULL) return; - ctxt->instate = XML_PARSER_EOF; + xmlHaltParser(ctxt); ctxt->errNo = XML_ERR_USER_STOP; - ctxt->disableSAX = 1; - if (ctxt->input != NULL) { - ctxt->input->cur = BAD_CAST""; - ctxt->input->base = ctxt->input->cur; - } } /**