You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
From d6b6dc7bb5e68fa11cb980bc08c4d9ea3f39b190 Mon Sep 17 00:00:00 2001 |
|
From: Daniel Veillard <veillard@redhat.com> |
|
Date: Fri, 20 Nov 2015 14:55:30 +0800 |
|
Subject: [PATCH] Add xmlHaltParser() to stop the parser |
|
To: libvir-list@redhat.com |
|
|
|
The problem is doing it in a consistent and safe fashion |
|
It's more complex than just setting ctxt->instate = XML_PARSER_EOF |
|
Update the public function to reuse that new internal routine |
|
|
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
|
--- |
|
parser.c | 34 +++++++++++++++++++++++++++++----- |
|
1 file changed, 29 insertions(+), 5 deletions(-) |
|
|
|
diff --git a/parser.c b/parser.c |
|
index e536e54..5b4f719 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 * |
|
@@ -12558,25 +12560,47 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, |
|
#endif /* LIBXML_PUSH_ENABLED */ |
|
|
|
/** |
|
- * xmlStopParser: |
|
+ * xmlHaltParser: |
|
* @ctxt: an XML parser context |
|
* |
|
- * Blocks further parser processing |
|
+ * Blocks further parser processing don't override error |
|
+ * for internal use |
|
*/ |
|
-void |
|
-xmlStopParser(xmlParserCtxtPtr ctxt) { |
|
+static void |
|
+xmlHaltParser(xmlParserCtxtPtr ctxt) { |
|
if (ctxt == NULL) |
|
return; |
|
ctxt->instate = XML_PARSER_EOF; |
|
- ctxt->errNo = XML_ERR_USER_STOP; |
|
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 |
|
+ * |
|
+ * Blocks further parser processing |
|
+ */ |
|
+void |
|
+xmlStopParser(xmlParserCtxtPtr ctxt) { |
|
+ if (ctxt == NULL) |
|
+ return; |
|
+ xmlHaltParser(ctxt); |
|
+ ctxt->errNo = XML_ERR_USER_STOP; |
|
+} |
|
+ |
|
+/** |
|
* xmlCreateIOParserCtxt: |
|
* @sax: a SAX handler |
|
* @user_data: The user data returned on SAX callbacks |
|
-- |
|
2.5.0 |
|
|
|
|