basebuilder_pel7x64builder0
7 years ago
43 changed files with 5129 additions and 0 deletions
@ -0,0 +1,140 @@ |
|||||||
|
commit 8ed73eb939d6c9b79f3fa41b76916cc443196bbc |
||||||
|
Author: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Thu Oct 2 16:17:09 2014 +0800 |
||||||
|
|
||||||
|
Fix for CVE-2014-3660 |
||||||
|
|
||||||
|
Issues related to the billion laugh entity expansion which happened to |
||||||
|
escape the initial set of fixes |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index f30588c..3c72cbb 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -130,6 +130,29 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
||||||
|
return (0); |
||||||
|
if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
||||||
|
return (1); |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * This may look absurd but is needed to detect |
||||||
|
+ * entities problems |
||||||
|
+ */ |
||||||
|
+ if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
||||||
|
+ (ent->content != NULL) && (ent->checked == 0)) { |
||||||
|
+ unsigned long oldnbent = ctxt->nbentities; |
||||||
|
+ xmlChar *rep; |
||||||
|
+ |
||||||
|
+ ent->checked = 1; |
||||||
|
+ |
||||||
|
+ rep = xmlStringDecodeEntities(ctxt, ent->content, |
||||||
|
+ XML_SUBSTITUTE_REF, 0, 0, 0); |
||||||
|
+ |
||||||
|
+ ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
||||||
|
+ if (rep != NULL) { |
||||||
|
+ if (xmlStrchr(rep, '<')) |
||||||
|
+ ent->checked |= 1; |
||||||
|
+ xmlFree(rep); |
||||||
|
+ rep = NULL; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
if (replacement != 0) { |
||||||
|
if (replacement < XML_MAX_TEXT_LENGTH) |
||||||
|
return(0); |
||||||
|
@@ -189,9 +212,12 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
||||||
|
return (0); |
||||||
|
} else { |
||||||
|
/* |
||||||
|
- * strange we got no data for checking just return |
||||||
|
+ * strange we got no data for checking |
||||||
|
*/ |
||||||
|
- return (0); |
||||||
|
+ if (((ctxt->lastError.code != XML_ERR_UNDECLARED_ENTITY) && |
||||||
|
+ (ctxt->lastError.code != XML_WAR_UNDECLARED_ENTITY)) || |
||||||
|
+ (ctxt->nbentities <= 10000)) |
||||||
|
+ return (0); |
||||||
|
} |
||||||
|
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
||||||
|
return (1); |
||||||
|
@@ -2584,6 +2610,7 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { |
||||||
|
name, NULL); |
||||||
|
ctxt->valid = 0; |
||||||
|
} |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, NULL, 0); |
||||||
|
} else if (ctxt->input->free != deallocblankswrapper) { |
||||||
|
input = xmlNewBlanksWrapperInputStream(ctxt, entity); |
||||||
|
if (xmlPushInput(ctxt, input) < 0) |
||||||
|
@@ -2737,6 +2764,7 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, |
||||||
|
if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || |
||||||
|
(ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) |
||||||
|
goto int_error; |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, ent, 0); |
||||||
|
if (ent != NULL) |
||||||
|
ctxt->nbentities += ent->checked / 2; |
||||||
|
if ((ent != NULL) && |
||||||
|
@@ -2788,6 +2816,7 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, |
||||||
|
ent = xmlParseStringPEReference(ctxt, &str); |
||||||
|
if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
||||||
|
goto int_error; |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, ent, 0); |
||||||
|
if (ent != NULL) |
||||||
|
ctxt->nbentities += ent->checked / 2; |
||||||
|
if (ent != NULL) { |
||||||
|
@@ -7286,6 +7315,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { |
||||||
|
(ret != XML_WAR_UNDECLARED_ENTITY)) { |
||||||
|
xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, |
||||||
|
"Entity '%s' failed to parse\n", ent->name); |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, ent, 0); |
||||||
|
} else if (list != NULL) { |
||||||
|
xmlFreeNodeList(list); |
||||||
|
list = NULL; |
||||||
|
@@ -7392,7 +7422,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { |
||||||
|
/* |
||||||
|
* We are copying here, make sure there is no abuse |
||||||
|
*/ |
||||||
|
- ctxt->sizeentcopy += ent->length; |
||||||
|
+ ctxt->sizeentcopy += ent->length + 5; |
||||||
|
if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) |
||||||
|
return; |
||||||
|
|
||||||
|
@@ -7440,7 +7470,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { |
||||||
|
/* |
||||||
|
* We are copying here, make sure there is no abuse |
||||||
|
*/ |
||||||
|
- ctxt->sizeentcopy += ent->length; |
||||||
|
+ ctxt->sizeentcopy += ent->length + 5; |
||||||
|
if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) |
||||||
|
return; |
||||||
|
|
||||||
|
@@ -7626,6 +7656,7 @@ xmlParseEntityRef(xmlParserCtxtPtr ctxt) { |
||||||
|
ctxt->sax->reference(ctxt->userData, name); |
||||||
|
} |
||||||
|
} |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, ent, 0); |
||||||
|
ctxt->valid = 0; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -7819,6 +7850,7 @@ xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, const xmlChar ** str) { |
||||||
|
"Entity '%s' not defined\n", |
||||||
|
name); |
||||||
|
} |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, ent, 0); |
||||||
|
/* TODO ? check regressions ctxt->valid = 0; */ |
||||||
|
} |
||||||
|
|
||||||
|
@@ -7978,6 +8010,7 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) |
||||||
|
name, NULL); |
||||||
|
ctxt->valid = 0; |
||||||
|
} |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, NULL, 0); |
||||||
|
} else { |
||||||
|
/* |
||||||
|
* Internal checking in case the entity quest barfed |
||||||
|
@@ -8217,6 +8250,7 @@ xmlParseStringPEReference(xmlParserCtxtPtr ctxt, const xmlChar **str) { |
||||||
|
name, NULL); |
||||||
|
ctxt->valid = 0; |
||||||
|
} |
||||||
|
+ xmlParserEntityCheck(ctxt, 0, NULL, 0); |
||||||
|
} else { |
||||||
|
/* |
||||||
|
* Internal checking in case the entity quest barfed |
@ -0,0 +1,35 @@ |
|||||||
|
diff -up libxml2-2.9.0/xzlib.c.do-not-check-crc libxml2-2.9.0/xzlib.c |
||||||
|
--- libxml2-2.9.0/xzlib.c.do-not-check-crc 2012-09-11 05:52:46.000000000 +0200 |
||||||
|
+++ libxml2-2.9.0/xzlib.c 2012-11-19 19:28:42.431700534 +0100 |
||||||
|
@@ -552,17 +552,20 @@ xz_decomp(xz_statep state) |
||||||
|
#ifdef HAVE_ZLIB_H |
||||||
|
if (state->how == GZIP) { |
||||||
|
if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { |
||||||
|
- xz_error(state, LZMA_DATA_ERROR, "unexpected end of file"); |
||||||
|
- return -1; |
||||||
|
- } |
||||||
|
- if (crc != state->zstrm.adler) { |
||||||
|
- xz_error(state, LZMA_DATA_ERROR, "incorrect data check"); |
||||||
|
- return -1; |
||||||
|
- } |
||||||
|
- if (len != (state->zstrm.total_out & 0xffffffffL)) { |
||||||
|
- xz_error(state, LZMA_DATA_ERROR, "incorrect length check"); |
||||||
|
- return -1; |
||||||
|
- } |
||||||
|
+ /* |
||||||
|
+ xz_error(state, LZMA_DATA_ERROR, "unexpected end of file"); |
||||||
|
+ return -1; |
||||||
|
+ */ |
||||||
|
+ } else { |
||||||
|
+ if (crc != state->zstrm.adler) { |
||||||
|
+ xz_error(state, LZMA_DATA_ERROR, "incorrect data check"); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ if (len != (state->zstrm.total_out & 0xffffffffL)) { |
||||||
|
+ xz_error(state, LZMA_DATA_ERROR, "incorrect length check"); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
state->strm.avail_in = 0; |
||||||
|
state->strm.next_in = NULL; |
||||||
|
state->strm.avail_out = 0; |
@ -0,0 +1,72 @@ |
|||||||
|
From d88b1b5e55b9ba0962408ff5e0327bf71a79e37a Mon Sep 17 00:00:00 2001 |
||||||
|
From: Peter Simons <psimons@suse.com> |
||||||
|
Date: Fri, 15 Apr 2016 11:56:55 +0200 |
||||||
|
Subject: [PATCH] Add missing increments of recursion depth counter to XML |
||||||
|
parser. |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=765207 |
||||||
|
CVE-2016-3705 |
||||||
|
The functions xmlParserEntityCheck() and xmlParseAttValueComplex() used to call |
||||||
|
xmlStringDecodeEntities() in a recursive context without incrementing the |
||||||
|
'depth' counter in the parser context. Because of that omission, the parser |
||||||
|
failed to detect attribute recursions in certain documents before running out |
||||||
|
of stack space. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 8 ++++++++ |
||||||
|
1 file changed, 8 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 0accf54..32293d0 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -144,8 +144,10 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
||||||
|
|
||||||
|
ent->checked = 1; |
||||||
|
|
||||||
|
+ ++ctxt->depth; |
||||||
|
rep = xmlStringDecodeEntities(ctxt, ent->content, |
||||||
|
XML_SUBSTITUTE_REF, 0, 0, 0); |
||||||
|
+ --ctxt->depth; |
||||||
|
|
||||||
|
ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
||||||
|
if (rep != NULL) { |
||||||
|
@@ -3963,8 +3965,10 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { |
||||||
|
* an entity declaration, it is bypassed and left as is. |
||||||
|
* so XML_SUBSTITUTE_REF is not set here. |
||||||
|
*/ |
||||||
|
+ ++ctxt->depth; |
||||||
|
ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, |
||||||
|
0, 0, 0); |
||||||
|
+ --ctxt->depth; |
||||||
|
if (orig != NULL) |
||||||
|
*orig = buf; |
||||||
|
else |
||||||
|
@@ -4089,9 +4093,11 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { |
||||||
|
} else if ((ent != NULL) && |
||||||
|
(ctxt->replaceEntities != 0)) { |
||||||
|
if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { |
||||||
|
+ ++ctxt->depth; |
||||||
|
rep = xmlStringDecodeEntities(ctxt, ent->content, |
||||||
|
XML_SUBSTITUTE_REF, |
||||||
|
0, 0, 0); |
||||||
|
+ --ctxt->depth; |
||||||
|
if (rep != NULL) { |
||||||
|
current = rep; |
||||||
|
while (*current != 0) { /* non input consuming */ |
||||||
|
@@ -4127,8 +4133,10 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { |
||||||
|
(ent->content != NULL) && (ent->checked == 0)) { |
||||||
|
unsigned long oldnbent = ctxt->nbentities; |
||||||
|
|
||||||
|
+ ++ctxt->depth; |
||||||
|
rep = xmlStringDecodeEntities(ctxt, ent->content, |
||||||
|
XML_SUBSTITUTE_REF, 0, 0, 0); |
||||||
|
+ --ctxt->depth; |
||||||
|
|
||||||
|
ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
||||||
|
if (rep != NULL) { |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,84 @@ |
|||||||
|
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 |
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
From 8d9f8c6dca5fd34743ed11ef0c570c4306db10e5 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 23 Oct 2015 19:02:28 +0800 |
||||||
|
Subject: [PATCH] Another variation of overflow in Conditional sections |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
Which happen after the previous fix to |
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=756456 |
||||||
|
|
||||||
|
But stopping the parser and exiting we didn't pop the intermediary entities |
||||||
|
and doing the SKIP there applies on an input which may be too small |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 4 +++- |
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index e2e0ad8..4926ab0 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6895,7 +6895,9 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
"All markup of the conditional section is not in the same entity\n", |
||||||
|
NULL, NULL); |
||||||
|
} |
||||||
|
- SKIP(3); |
||||||
|
+ if ((ctxt-> instate != XML_PARSER_EOF) && |
||||||
|
+ ((ctxt->input->cur + 3) < ctxt->input->end)) |
||||||
|
+ SKIP(3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,62 @@ |
|||||||
|
From 2fc95df152622cf5cf1d478af6ed3538e170118b Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 23 May 2016 12:27:58 +0800 |
||||||
|
Subject: [PATCH] Avoid building recursive entities |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=762100 |
||||||
|
|
||||||
|
When we detect a recusive entity we should really not |
||||||
|
build the associated data, moreover if someone bypass |
||||||
|
libxml2 fatal errors and still tries to serialize a broken |
||||||
|
entity make sure we don't risk to get ito a recursion |
||||||
|
|
||||||
|
* parser.c: xmlParserEntityCheck() don't build if entity loop |
||||||
|
were found and remove the associated text content |
||||||
|
* tree.c: xmlStringGetNodeList() avoid a potential recursion |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 6 +++++- |
||||||
|
tree.c | 1 + |
||||||
|
2 files changed, 6 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 32293d0..2ae44c5 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -138,7 +138,8 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
||||||
|
* entities problems |
||||||
|
*/ |
||||||
|
if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
||||||
|
- (ent->content != NULL) && (ent->checked == 0)) { |
||||||
|
+ (ent->content != NULL) && (ent->checked == 0) && |
||||||
|
+ (ctxt->errNo != XML_ERR_ENTITY_LOOP)) { |
||||||
|
unsigned long oldnbent = ctxt->nbentities; |
||||||
|
xmlChar *rep; |
||||||
|
|
||||||
|
@@ -148,6 +149,9 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
||||||
|
rep = xmlStringDecodeEntities(ctxt, ent->content, |
||||||
|
XML_SUBSTITUTE_REF, 0, 0, 0); |
||||||
|
--ctxt->depth; |
||||||
|
+ if (ctxt->errNo == XML_ERR_ENTITY_LOOP) { |
||||||
|
+ ent->content[0] = 0; |
||||||
|
+ } |
||||||
|
|
||||||
|
ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
||||||
|
if (rep != NULL) { |
||||||
|
diff --git a/tree.c b/tree.c |
||||||
|
index 7e5af26..83ec66f 100644 |
||||||
|
--- a/tree.c |
||||||
|
+++ b/tree.c |
||||||
|
@@ -1588,6 +1588,7 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) { |
||||||
|
else if ((ent != NULL) && (ent->children == NULL)) { |
||||||
|
xmlNodePtr temp; |
||||||
|
|
||||||
|
+ ent->children = (xmlNodePtr) -1; |
||||||
|
ent->children = xmlStringGetNodeList(doc, |
||||||
|
(const xmlChar*)node->content); |
||||||
|
ent->owner = 1; |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,38 @@ |
|||||||
|
From eb1114e90b22e09d500840bac1e171763e8baa16 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Hugh Davenport <hugh@allthethings.co.nz> |
||||||
|
Date: Tue, 3 Nov 2015 20:40:49 +0800 |
||||||
|
Subject: [PATCH] Avoid extra processing of MarkupDecl when EOF |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756263 |
||||||
|
|
||||||
|
One place where ctxt->instate == XML_PARSER_EOF whic was set up |
||||||
|
by entity detection issues doesn't get noticed, and even overrided |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 8 ++++++++ |
||||||
|
1 file changed, 8 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index b56d94c..262db1e 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6952,6 +6952,14 @@ xmlParseMarkupDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
xmlParsePI(ctxt); |
||||||
|
} |
||||||
|
} |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * detect requirement to exit there and act accordingly |
||||||
|
+ * and avoid having instate overriden later on |
||||||
|
+ */ |
||||||
|
+ if (ctxt->instate == XML_PARSER_EOF) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
/* |
||||||
|
* This is only for internal subset. On external entities, |
||||||
|
* the replacement is done before parsing stage |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,85 @@ |
|||||||
|
From 7c2be3213eeddd202c3e4c600cf3cfac06fb128a Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 9 Nov 2015 18:07:18 +0800 |
||||||
|
Subject: [PATCH] Avoid processing entities after encoding conversion failures |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756527 |
||||||
|
and was also raised by Chromium team in the past |
||||||
|
|
||||||
|
When we hit a convwersion failure when switching encoding |
||||||
|
it is bestter to stop parsing there, this was treated as a |
||||||
|
fatal error but the parser was continuing to process to extract |
||||||
|
more errors, unfortunately that makes little sense as the data |
||||||
|
is obviously corrupt and can potentially lead to unexpected behaviour. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 7 +++++-- |
||||||
|
parserInternals.c | 11 ++++++++++- |
||||||
|
2 files changed, 15 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 262db1e..134ea7f 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -10598,7 +10598,8 @@ xmlParseXMLDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n"); |
||||||
|
} |
||||||
|
xmlParseEncodingDecl(ctxt); |
||||||
|
- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { |
||||||
|
+ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) || |
||||||
|
+ (ctxt->instate == XML_PARSER_EOF)) { |
||||||
|
/* |
||||||
|
* The XML REC instructs us to stop parsing right here |
||||||
|
*/ |
||||||
|
@@ -10722,6 +10723,7 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
if (CUR == 0) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); |
||||||
|
+ return(-1); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
@@ -10739,7 +10741,8 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { |
||||||
|
* Note that we will switch encoding on the fly. |
||||||
|
*/ |
||||||
|
xmlParseXMLDecl(ctxt); |
||||||
|
- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { |
||||||
|
+ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) || |
||||||
|
+ (ctxt->instate == XML_PARSER_EOF)) { |
||||||
|
/* |
||||||
|
* The XML REC instructs us to stop parsing right here |
||||||
|
*/ |
||||||
|
diff --git a/parserInternals.c b/parserInternals.c |
||||||
|
index f8a7041..9acfea4 100644 |
||||||
|
--- a/parserInternals.c |
||||||
|
+++ b/parserInternals.c |
||||||
|
@@ -937,6 +937,7 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) |
||||||
|
{ |
||||||
|
xmlCharEncodingHandlerPtr handler; |
||||||
|
int len = -1; |
||||||
|
+ int ret; |
||||||
|
|
||||||
|
if (ctxt == NULL) return(-1); |
||||||
|
switch (enc) { |
||||||
|
@@ -1097,7 +1098,15 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) |
||||||
|
if (handler == NULL) |
||||||
|
return(-1); |
||||||
|
ctxt->charset = XML_CHAR_ENCODING_UTF8; |
||||||
|
- return(xmlSwitchToEncodingInt(ctxt, handler, len)); |
||||||
|
+ ret = xmlSwitchToEncodingInt(ctxt, handler, len); |
||||||
|
+ if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) { |
||||||
|
+ /* |
||||||
|
+ * on encoding conversion errors, stop the parser |
||||||
|
+ */ |
||||||
|
+ xmlStopParser(ctxt); |
||||||
|
+ ctxt->errNo = XML_I18N_CONV_FAILED; |
||||||
|
+ } |
||||||
|
+ return(ret); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,38 @@ |
|||||||
|
From 367c602b42f1afe7ed50508b01491b5690d54d52 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pranjal Jumde <pjumde@apple.com> |
||||||
|
Date: Mon, 7 Mar 2016 06:34:26 -0800 |
||||||
|
Subject: [PATCH] Bug 757711: heap-buffer-overflow in xmlFAParsePosCharGroup |
||||||
|
<https://bugzilla.gnome.org/show_bug.cgi?id=757711> |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
* xmlregexp.c: |
||||||
|
(xmlFAParseCharRange): Only advance to the next character if |
||||||
|
there is no error. Advancing to the next character in case of |
||||||
|
an error while parsing regexp leads to an out of bounds access. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
xmlregexp.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/xmlregexp.c b/xmlregexp.c |
||||||
|
index 1f9911c..eb67b74 100644 |
||||||
|
--- a/xmlregexp.c |
||||||
|
+++ b/xmlregexp.c |
||||||
|
@@ -5050,11 +5050,12 @@ xmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { |
||||||
|
ERROR("Expecting the end of a char range"); |
||||||
|
return; |
||||||
|
} |
||||||
|
- NEXTL(len); |
||||||
|
+ |
||||||
|
/* TODO check that the values are acceptable character ranges for XML */ |
||||||
|
if (end < start) { |
||||||
|
ERROR("End of range is before start of range"); |
||||||
|
} else { |
||||||
|
+ NEXTL(len); |
||||||
|
xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, |
||||||
|
XML_REGEXP_CHARVAL, start, end, NULL); |
||||||
|
} |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,114 @@ |
|||||||
|
commit 3018042fd3c11c3d6cda36b3cbae4f7bb4f20c3d |
||||||
|
Author: Pranjal Jumde <pjumde@apple.com> |
||||||
|
Date: Tue Mar 1 11:34:04 2016 -0800 |
||||||
|
|
||||||
|
Bug 758605: Heap-based buffer overread in xmlDictAddString <https://bugzilla.gnome.org/show_bug.cgi?id=758605> |
||||||
|
|
||||||
|
Reviewed by David Kilzer. |
||||||
|
|
||||||
|
* HTMLparser.c: |
||||||
|
(htmlParseName): Add bounds check. |
||||||
|
(htmlParseNameComplex): Ditto. |
||||||
|
* result/HTML/758605.html: Added. |
||||||
|
* result/HTML/758605.html.err: Added. |
||||||
|
* result/HTML/758605.html.sax: Added. |
||||||
|
* runtest.c: |
||||||
|
(pushParseTest): The input for the new test case was so small |
||||||
|
(4 bytes) that htmlParseChunk() was never called after |
||||||
|
htmlCreatePushParserCtxt(), thereby creating a false positive |
||||||
|
test failure. Fixed by using a do-while loop so we always call |
||||||
|
htmlParseChunk() at least once. |
||||||
|
* test/HTML/758605.html: Added. |
||||||
|
|
||||||
|
diff --git a/HTMLparser.c b/HTMLparser.c |
||||||
|
index 4331d53..a897cb0 100644 |
||||||
|
--- a/HTMLparser.c |
||||||
|
+++ b/HTMLparser.c |
||||||
|
@@ -2471,6 +2471,10 @@ htmlParseName(htmlParserCtxtPtr ctxt) { |
||||||
|
(*in == '_') || (*in == '-') || |
||||||
|
(*in == ':') || (*in == '.')) |
||||||
|
in++; |
||||||
|
+ |
||||||
|
+ if (in == ctxt->input->end) |
||||||
|
+ return(NULL); |
||||||
|
+ |
||||||
|
if ((*in > 0) && (*in < 0x80)) { |
||||||
|
count = in - ctxt->input->cur; |
||||||
|
ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); |
||||||
|
@@ -2514,6 +2518,10 @@ htmlParseNameComplex(xmlParserCtxtPtr ctxt) { |
||||||
|
NEXTL(l); |
||||||
|
c = CUR_CHAR(l); |
||||||
|
} |
||||||
|
+ |
||||||
|
+ if (ctxt->input->base > ctxt->input->cur - len) |
||||||
|
+ return(NULL); |
||||||
|
+ |
||||||
|
return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); |
||||||
|
} |
||||||
|
|
||||||
|
diff --git a/result/HTML/758605.html b/result/HTML/758605.html |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..a085cce |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/HTML/758605.html |
||||||
|
@@ -0,0 +1,3 @@ |
||||||
|
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||||
|
+<html><body><p>& |
||||||
|
+</p></body></html> |
||||||
|
diff --git a/result/HTML/758605.html.err b/result/HTML/758605.html.err |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..2b82be6 |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/HTML/758605.html.err |
||||||
|
@@ -0,0 +1,3 @@ |
||||||
|
+./test/HTML/758605.html:1: HTML parser error : htmlParseEntityRef: no name |
||||||
|
+ê |
||||||
|
+ ^ |
||||||
|
diff --git a/result/HTML/758605.html.sax b/result/HTML/758605.html.sax |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..1f5cd32 |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/HTML/758605.html.sax |
||||||
|
@@ -0,0 +1,13 @@ |
||||||
|
+SAX.setDocumentLocator() |
||||||
|
+SAX.startDocument() |
||||||
|
+SAX.error: htmlParseEntityRef: no name |
||||||
|
+SAX.startElement(html) |
||||||
|
+SAX.startElement(body) |
||||||
|
+SAX.startElement(p) |
||||||
|
+SAX.characters(&, 1) |
||||||
|
+SAX.ignorableWhitespace( |
||||||
|
+, 1) |
||||||
|
+SAX.endElement(p) |
||||||
|
+SAX.endElement(body) |
||||||
|
+SAX.endElement(html) |
||||||
|
+SAX.endDocument() |
||||||
|
diff --git a/runtest.c b/runtest.c |
||||||
|
index ccdd49b..0afa788 100644 |
||||||
|
--- a/runtest.c |
||||||
|
+++ b/runtest.c |
||||||
|
@@ -1824,7 +1824,7 @@ pushParseTest(const char *filename, const char *result, |
||||||
|
ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename); |
||||||
|
xmlCtxtUseOptions(ctxt, options); |
||||||
|
cur += 4; |
||||||
|
- while (cur < size) { |
||||||
|
+ do { |
||||||
|
if (cur + 1024 >= size) { |
||||||
|
#ifdef LIBXML_HTML_ENABLED |
||||||
|
if (options & XML_PARSE_HTML) |
||||||
|
@@ -1842,7 +1842,7 @@ pushParseTest(const char *filename, const char *result, |
||||||
|
xmlParseChunk(ctxt, base + cur, 1024, 0); |
||||||
|
cur += 1024; |
||||||
|
} |
||||||
|
- } |
||||||
|
+ } while (cur < size); |
||||||
|
doc = ctxt->myDoc; |
||||||
|
#ifdef LIBXML_HTML_ENABLED |
||||||
|
if (options & XML_PARSE_HTML) |
||||||
|
diff --git a/test/HTML/758605.html b/test/HTML/758605.html |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..9b1b3c2 |
||||||
|
--- /dev/null |
||||||
|
+++ b/test/HTML/758605.html |
||||||
|
@@ -0,0 +1 @@ |
||||||
|
+&:ê |
@ -0,0 +1,53 @@ |
|||||||
|
From b1a4e51efbfb1ae3a37a14be73d438aaab6b5c9e Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pranjal Jumde <pjumde@apple.com> |
||||||
|
Date: Tue, 8 Mar 2016 17:29:00 -0800 |
||||||
|
Subject: [PATCH] Bug 763071: heap-buffer-overflow in xmlStrncat |
||||||
|
<https://bugzilla.gnome.org/show_bug.cgi?id=763071> |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
* xmlstring.c: |
||||||
|
(xmlStrncat): Return NULL if xmlStrlen returns a negative length. |
||||||
|
(xmlStrncatNew): Ditto. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
xmlstring.c | 9 ++++++++- |
||||||
|
1 file changed, 8 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/xmlstring.c b/xmlstring.c |
||||||
|
index a37220d..d465c23 100644 |
||||||
|
--- a/xmlstring.c |
||||||
|
+++ b/xmlstring.c |
||||||
|
@@ -457,6 +457,8 @@ xmlStrncat(xmlChar *cur, const xmlChar *add, int len) { |
||||||
|
return(xmlStrndup(add, len)); |
||||||
|
|
||||||
|
size = xmlStrlen(cur); |
||||||
|
+ if (size < 0) |
||||||
|
+ return(NULL); |
||||||
|
ret = (xmlChar *) xmlRealloc(cur, (size + len + 1) * sizeof(xmlChar)); |
||||||
|
if (ret == NULL) { |
||||||
|
xmlErrMemory(NULL, NULL); |
||||||
|
@@ -484,14 +486,19 @@ xmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len) { |
||||||
|
int size; |
||||||
|
xmlChar *ret; |
||||||
|
|
||||||
|
- if (len < 0) |
||||||
|
+ if (len < 0) { |
||||||
|
len = xmlStrlen(str2); |
||||||
|
+ if (len < 0) |
||||||
|
+ return(NULL); |
||||||
|
+ } |
||||||
|
if ((str2 == NULL) || (len == 0)) |
||||||
|
return(xmlStrdup(str1)); |
||||||
|
if (str1 == NULL) |
||||||
|
return(xmlStrndup(str2, len)); |
||||||
|
|
||||||
|
size = xmlStrlen(str1); |
||||||
|
+ if (size < 0) |
||||||
|
+ return(NULL); |
||||||
|
ret = (xmlChar *) xmlMalloc((size + len + 1) * sizeof(xmlChar)); |
||||||
|
if (ret == NULL) { |
||||||
|
xmlErrMemory(NULL, NULL); |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,30 @@ |
|||||||
|
From 3154c607f22497fa843b8ad8a596ef5523d42ee6 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 15:07:38 +0800 |
||||||
|
Subject: [PATCH] Bug on creating new stream from entity |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
sometimes the entity could have a lenght of 0, i.e. it wasn't |
||||||
|
parsed or used yet, and we ended up with an incoherent input state |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parserInternals.c | 2 ++ |
||||||
|
1 file changed, 2 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parserInternals.c b/parserInternals.c |
||||||
|
index 9acfea4..1fe1f6a 100644 |
||||||
|
--- a/parserInternals.c |
||||||
|
+++ b/parserInternals.c |
||||||
|
@@ -1459,6 +1459,8 @@ xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { |
||||||
|
if (entity->URI != NULL) |
||||||
|
input->filename = (char *) xmlStrdup((xmlChar *) entity->URI); |
||||||
|
input->base = entity->content; |
||||||
|
+ if (entity->length == 0) |
||||||
|
+ entity->length = xmlStrlen(entity->content); |
||||||
|
input->cur = entity->content; |
||||||
|
input->length = entity->length; |
||||||
|
input->end = &entity->content[input->length]; |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,179 @@ |
|||||||
|
From 5cec67e3f8d56e6e5fda2f90e102950cbb09e3d1 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Tue, 14 Apr 2015 17:41:48 +0800 |
||||||
|
Subject: [PATCH] CVE-2015-1819 Enforce the reader to run in constant memory |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
One of the operation on the reader could resolve entities |
||||||
|
leading to the classic expansion issue. Make sure the |
||||||
|
buffer used for xmlreader operation is bounded. |
||||||
|
Introduce a new allocation type for the buffers for this effect. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
buf.c | 43 ++++++++++++++++++++++++++++++++++++++++++- |
||||||
|
include/libxml/tree.h | 3 ++- |
||||||
|
xmlreader.c | 20 +++++++++++++++++++- |
||||||
|
3 files changed, 63 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/buf.c b/buf.c |
||||||
|
index d1756c4..b52e41d 100644 |
||||||
|
--- a/buf.c |
||||||
|
+++ b/buf.c |
||||||
|
@@ -27,6 +27,7 @@ |
||||||
|
#include <libxml/tree.h> |
||||||
|
#include <libxml/globals.h> |
||||||
|
#include <libxml/tree.h> |
||||||
|
+#include <libxml/parserInternals.h> /* for XML_MAX_TEXT_LENGTH */ |
||||||
|
#include "buf.h" |
||||||
|
|
||||||
|
#define WITH_BUFFER_COMPAT |
||||||
|
@@ -299,7 +300,8 @@ xmlBufSetAllocationScheme(xmlBufPtr buf, |
||||||
|
if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) || |
||||||
|
(scheme == XML_BUFFER_ALLOC_EXACT) || |
||||||
|
(scheme == XML_BUFFER_ALLOC_HYBRID) || |
||||||
|
- (scheme == XML_BUFFER_ALLOC_IMMUTABLE)) { |
||||||
|
+ (scheme == XML_BUFFER_ALLOC_IMMUTABLE) || |
||||||
|
+ (scheme == XML_BUFFER_ALLOC_BOUNDED)) { |
||||||
|
buf->alloc = scheme; |
||||||
|
if (buf->buffer) |
||||||
|
buf->buffer->alloc = scheme; |
||||||
|
@@ -458,6 +460,18 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) { |
||||||
|
size = buf->use + len + 100; |
||||||
|
#endif |
||||||
|
|
||||||
|
+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { |
||||||
|
+ /* |
||||||
|
+ * Used to provide parsing limits |
||||||
|
+ */ |
||||||
|
+ if ((buf->use + len >= XML_MAX_TEXT_LENGTH) || |
||||||
|
+ (buf->size >= XML_MAX_TEXT_LENGTH)) { |
||||||
|
+ xmlBufMemoryError(buf, "buffer error: text too long\n"); |
||||||
|
+ return(0); |
||||||
|
+ } |
||||||
|
+ if (size >= XML_MAX_TEXT_LENGTH) |
||||||
|
+ size = XML_MAX_TEXT_LENGTH; |
||||||
|
+ } |
||||||
|
if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { |
||||||
|
size_t start_buf = buf->content - buf->contentIO; |
||||||
|
|
||||||
|
@@ -739,6 +753,15 @@ xmlBufResize(xmlBufPtr buf, size_t size) |
||||||
|
CHECK_COMPAT(buf) |
||||||
|
|
||||||
|
if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); |
||||||
|
+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { |
||||||
|
+ /* |
||||||
|
+ * Used to provide parsing limits |
||||||
|
+ */ |
||||||
|
+ if (size >= XML_MAX_TEXT_LENGTH) { |
||||||
|
+ xmlBufMemoryError(buf, "buffer error: text too long\n"); |
||||||
|
+ return(0); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
|
||||||
|
/* Don't resize if we don't have to */ |
||||||
|
if (size < buf->size) |
||||||
|
@@ -867,6 +890,15 @@ xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len) { |
||||||
|
|
||||||
|
needSize = buf->use + len + 2; |
||||||
|
if (needSize > buf->size){ |
||||||
|
+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { |
||||||
|
+ /* |
||||||
|
+ * Used to provide parsing limits |
||||||
|
+ */ |
||||||
|
+ if (needSize >= XML_MAX_TEXT_LENGTH) { |
||||||
|
+ xmlBufMemoryError(buf, "buffer error: text too long\n"); |
||||||
|
+ return(-1); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
if (!xmlBufResize(buf, needSize)){ |
||||||
|
xmlBufMemoryError(buf, "growing buffer"); |
||||||
|
return XML_ERR_NO_MEMORY; |
||||||
|
@@ -938,6 +970,15 @@ xmlBufAddHead(xmlBufPtr buf, const xmlChar *str, int len) { |
||||||
|
} |
||||||
|
needSize = buf->use + len + 2; |
||||||
|
if (needSize > buf->size){ |
||||||
|
+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { |
||||||
|
+ /* |
||||||
|
+ * Used to provide parsing limits |
||||||
|
+ */ |
||||||
|
+ if (needSize >= XML_MAX_TEXT_LENGTH) { |
||||||
|
+ xmlBufMemoryError(buf, "buffer error: text too long\n"); |
||||||
|
+ return(-1); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
if (!xmlBufResize(buf, needSize)){ |
||||||
|
xmlBufMemoryError(buf, "growing buffer"); |
||||||
|
return XML_ERR_NO_MEMORY; |
||||||
|
diff --git a/include/libxml/tree.h b/include/libxml/tree.h |
||||||
|
index 7e06686..d904a44 100644 |
||||||
|
--- a/include/libxml/tree.h |
||||||
|
+++ b/include/libxml/tree.h |
||||||
|
@@ -76,7 +76,8 @@ typedef enum { |
||||||
|
XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */ |
||||||
|
XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */ |
||||||
|
XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */ |
||||||
|
- XML_BUFFER_ALLOC_HYBRID /* exact up to a threshold, and doubleit thereafter */ |
||||||
|
+ XML_BUFFER_ALLOC_HYBRID, /* exact up to a threshold, and doubleit thereafter */ |
||||||
|
+ XML_BUFFER_ALLOC_BOUNDED /* limit the upper size of the buffer */ |
||||||
|
} xmlBufferAllocationScheme; |
||||||
|
|
||||||
|
/** |
||||||
|
diff --git a/xmlreader.c b/xmlreader.c |
||||||
|
index 00083d0..4fabaa9 100644 |
||||||
|
--- a/xmlreader.c |
||||||
|
+++ b/xmlreader.c |
||||||
|
@@ -2077,6 +2077,9 @@ xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) { |
||||||
|
"xmlNewTextReader : malloc failed\n"); |
||||||
|
return(NULL); |
||||||
|
} |
||||||
|
+ /* no operation on a reader should require a huge buffer */ |
||||||
|
+ xmlBufSetAllocationScheme(ret->buffer, |
||||||
|
+ XML_BUFFER_ALLOC_BOUNDED); |
||||||
|
ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); |
||||||
|
if (ret->sax == NULL) { |
||||||
|
xmlBufFree(ret->buffer); |
||||||
|
@@ -3602,6 +3605,7 @@ xmlTextReaderConstValue(xmlTextReaderPtr reader) { |
||||||
|
return(((xmlNsPtr) node)->href); |
||||||
|
case XML_ATTRIBUTE_NODE:{ |
||||||
|
xmlAttrPtr attr = (xmlAttrPtr) node; |
||||||
|
+ const xmlChar *ret; |
||||||
|
|
||||||
|
if ((attr->children != NULL) && |
||||||
|
(attr->children->type == XML_TEXT_NODE) && |
||||||
|
@@ -3615,10 +3619,21 @@ xmlTextReaderConstValue(xmlTextReaderPtr reader) { |
||||||
|
"xmlTextReaderSetup : malloc failed\n"); |
||||||
|
return (NULL); |
||||||
|
} |
||||||
|
+ xmlBufSetAllocationScheme(reader->buffer, |
||||||
|
+ XML_BUFFER_ALLOC_BOUNDED); |
||||||
|
} else |
||||||
|
xmlBufEmpty(reader->buffer); |
||||||
|
xmlBufGetNodeContent(reader->buffer, node); |
||||||
|
- return(xmlBufContent(reader->buffer)); |
||||||
|
+ ret = xmlBufContent(reader->buffer); |
||||||
|
+ if (ret == NULL) { |
||||||
|
+ /* error on the buffer best to reallocate */ |
||||||
|
+ xmlBufFree(reader->buffer); |
||||||
|
+ reader->buffer = xmlBufCreateSize(100); |
||||||
|
+ xmlBufSetAllocationScheme(reader->buffer, |
||||||
|
+ XML_BUFFER_ALLOC_BOUNDED); |
||||||
|
+ ret = BAD_CAST ""; |
||||||
|
+ } |
||||||
|
+ return(ret); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
@@ -5117,6 +5132,9 @@ xmlTextReaderSetup(xmlTextReaderPtr reader, |
||||||
|
"xmlTextReaderSetup : malloc failed\n"); |
||||||
|
return (-1); |
||||||
|
} |
||||||
|
+ /* no operation on a reader should require a huge buffer */ |
||||||
|
+ xmlBufSetAllocationScheme(reader->buffer, |
||||||
|
+ XML_BUFFER_ALLOC_BOUNDED); |
||||||
|
if (reader->sax == NULL) |
||||||
|
reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); |
||||||
|
if (reader->sax == NULL) { |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
From 4e1ea576167520bbc2bad50797119983e133af74 Mon Sep 17 00:00:00 2001 |
||||||
|
From: David Drysdale <drysdale@google.com> |
||||||
|
Date: Fri, 20 Nov 2015 11:13:45 +0800 |
||||||
|
Subject: [PATCH] CVE-2015-5312 Another entity expansion issue |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756733 |
||||||
|
It is one case where the code in place to detect entities expansions |
||||||
|
failed to exit when the situation was detected, leading to DoS |
||||||
|
Problem reported by Kostya Serebryany @ Google |
||||||
|
Patch provided by David Drysdale @ Google |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 4 ++++ |
||||||
|
1 file changed, 4 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index a58dda3..e536e54 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2801,6 +2801,10 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, |
||||||
|
0, 0, 0); |
||||||
|
ctxt->depth--; |
||||||
|
|
||||||
|
+ if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || |
||||||
|
+ (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) |
||||||
|
+ goto int_error; |
||||||
|
+ |
||||||
|
if (rep != NULL) { |
||||||
|
current = rep; |
||||||
|
while (*current != 0) { /* non input consuming loop */ |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,36 @@ |
|||||||
|
From 540a3b58c233db4f2d2becea9c2b79b3ce190055 Mon Sep 17 00:00:00 2001 |
||||||
|
From: David Drysdale <drysdale@google.com> |
||||||
|
Date: Fri, 20 Nov 2015 10:47:12 +0800 |
||||||
|
Subject: [PATCH] CVE-2015-7497 Avoid an heap buffer overflow in |
||||||
|
xmlDictComputeFastQKey |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756528 |
||||||
|
It was possible to hit a negative offset in the name indexing |
||||||
|
used to randomize the dictionary key generation |
||||||
|
Reported and fix provided by David Drysdale @ Google |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
dict.c | 5 ++++- |
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/dict.c b/dict.c |
||||||
|
index 5f71d55..8c8f931 100644 |
||||||
|
--- a/dict.c |
||||||
|
+++ b/dict.c |
||||||
|
@@ -486,7 +486,10 @@ xmlDictComputeFastQKey(const xmlChar *prefix, int plen, |
||||||
|
value += 30 * (*prefix); |
||||||
|
|
||||||
|
if (len > 10) { |
||||||
|
- value += name[len - (plen + 1 + 1)]; |
||||||
|
+ int offset = len - (plen + 1 + 1); |
||||||
|
+ if (offset < 0) |
||||||
|
+ offset = len - (10 + 1); |
||||||
|
+ value += name[offset]; |
||||||
|
len = 10; |
||||||
|
if (plen > 10) |
||||||
|
plen = 10; |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,108 @@ |
|||||||
|
From d9825f106532a898bb6df46effa0bf099ec16a47 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 16:06:59 +0800 |
||||||
|
Subject: [PATCH] CVE-2015-7500 Fix memory access error due to incorrect |
||||||
|
entities boundaries |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756525 |
||||||
|
handle properly the case where we popped out of the current entity |
||||||
|
while processing a start tag |
||||||
|
Reported by Kostya Serebryany @ Google |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 28 ++++++++++++++++++++++------ |
||||||
|
1 file changed, 22 insertions(+), 6 deletions(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index cc45e17..f4fc310 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -9309,7 +9309,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref, |
||||||
|
const xmlChar **atts = ctxt->atts; |
||||||
|
int maxatts = ctxt->maxatts; |
||||||
|
int nratts, nbatts, nbdef; |
||||||
|
- int i, j, nbNs, attval, oldline, oldcol; |
||||||
|
+ int i, j, nbNs, attval, oldline, oldcol, inputNr; |
||||||
|
const xmlChar *base; |
||||||
|
unsigned long cur; |
||||||
|
int nsNr = ctxt->nsNr; |
||||||
|
@@ -9328,6 +9328,7 @@ reparse: |
||||||
|
SHRINK; |
||||||
|
base = ctxt->input->base; |
||||||
|
cur = ctxt->input->cur - ctxt->input->base; |
||||||
|
+ inputNr = ctxt->inputNr; |
||||||
|
oldline = ctxt->input->line; |
||||||
|
oldcol = ctxt->input->col; |
||||||
|
nbatts = 0; |
||||||
|
@@ -9353,7 +9354,8 @@ reparse: |
||||||
|
*/ |
||||||
|
SKIP_BLANKS; |
||||||
|
GROW; |
||||||
|
- if (ctxt->input->base != base) goto base_changed; |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
+ goto base_changed; |
||||||
|
|
||||||
|
while (((RAW != '>') && |
||||||
|
((RAW != '/') || (NXT(1) != '>')) && |
||||||
|
@@ -9364,7 +9366,7 @@ reparse: |
||||||
|
|
||||||
|
attname = xmlParseAttribute2(ctxt, prefix, localname, |
||||||
|
&aprefix, &attvalue, &len, &alloc); |
||||||
|
- if (ctxt->input->base != base) { |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) { |
||||||
|
if ((attvalue != NULL) && (alloc != 0)) |
||||||
|
xmlFree(attvalue); |
||||||
|
attvalue = NULL; |
||||||
|
@@ -9493,7 +9495,8 @@ skip_default_ns: |
||||||
|
skip_ns: |
||||||
|
if (alloc != 0) xmlFree(attvalue); |
||||||
|
SKIP_BLANKS; |
||||||
|
- if (ctxt->input->base != base) goto base_changed; |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
+ goto base_changed; |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -9530,7 +9533,8 @@ failed: |
||||||
|
GROW |
||||||
|
if (ctxt->instate == XML_PARSER_EOF) |
||||||
|
break; |
||||||
|
- if (ctxt->input->base != base) goto base_changed; |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
+ goto base_changed; |
||||||
|
if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
||||||
|
break; |
||||||
|
if (!IS_BLANK_CH(RAW)) { |
||||||
|
@@ -9546,7 +9550,8 @@ failed: |
||||||
|
break; |
||||||
|
} |
||||||
|
GROW; |
||||||
|
- if (ctxt->input->base != base) goto base_changed; |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
+ goto base_changed; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
@@ -9713,6 +9718,17 @@ base_changed: |
||||||
|
if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) |
||||||
|
xmlFree((xmlChar *) atts[i]); |
||||||
|
} |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * We can't switch from one entity to another in the middle |
||||||
|
+ * of a start tag |
||||||
|
+ */ |
||||||
|
+ if (inputNr != ctxt->inputNr) { |
||||||
|
+ xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, |
||||||
|
+ "Start tag doesn't start and stop in the same entity\n"); |
||||||
|
+ return(NULL); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
ctxt->input->cur = ctxt->input->base + cur; |
||||||
|
ctxt->input->line = oldline; |
||||||
|
ctxt->input->col = oldcol; |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
From ebf48b59943833b5f57e909e5d00f0d6e75e874e Mon Sep 17 00:00:00 2001 |
||||||
|
From: Hugh Davenport <hugh@allthethings.co.nz> |
||||||
|
Date: Fri, 20 Nov 2015 17:16:06 +0800 |
||||||
|
Subject: [PATCH] CVE-2015-8242 Buffer overead with HTML parser in push mode |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=756372 |
||||||
|
Error in the code pointing to the codepoint in the stack for the |
||||||
|
current char value instead of the pointer in the input that the SAX |
||||||
|
callback expects |
||||||
|
Reported and fixed by Hugh Davenport |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
HTMLparser.c | 6 +++--- |
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/HTMLparser.c b/HTMLparser.c |
||||||
|
index cab499a..4331d53 100644 |
||||||
|
--- a/HTMLparser.c |
||||||
|
+++ b/HTMLparser.c |
||||||
|
@@ -5708,17 +5708,17 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
if (ctxt->keepBlanks) { |
||||||
|
if (ctxt->sax->characters != NULL) |
||||||
|
ctxt->sax->characters( |
||||||
|
- ctxt->userData, &cur, 1); |
||||||
|
+ ctxt->userData, &in->cur[0], 1); |
||||||
|
} else { |
||||||
|
if (ctxt->sax->ignorableWhitespace != NULL) |
||||||
|
ctxt->sax->ignorableWhitespace( |
||||||
|
- ctxt->userData, &cur, 1); |
||||||
|
+ ctxt->userData, &in->cur[0], 1); |
||||||
|
} |
||||||
|
} else { |
||||||
|
htmlCheckParagraph(ctxt); |
||||||
|
if (ctxt->sax->characters != NULL) |
||||||
|
ctxt->sax->characters( |
||||||
|
- ctxt->userData, &cur, 1); |
||||||
|
+ ctxt->userData, &in->cur[0], 1); |
||||||
|
} |
||||||
|
} |
||||||
|
ctxt->token = 0; |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,52 @@ |
|||||||
|
From 5b47a2c6666f0293a5164f094b9e8031914b1f8f Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 23 Feb 2015 11:29:20 +0800 |
||||||
|
Subject: [PATCH] Cleanup conditional section error handling |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=744980 |
||||||
|
|
||||||
|
The error handling of Conditional Section also need to be |
||||||
|
straightened as the structure of the document can't be |
||||||
|
guessed on a failure there and it's better to stop parsing |
||||||
|
as further errors are likely to be irrelevant. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 6 ++++++ |
||||||
|
1 file changed, 6 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index d790f8e..dc14e5c 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6761,6 +6761,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
SKIP_BLANKS; |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
+ xmlStopParser(ctxt); |
||||||
|
+ return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, |
||||||
|
@@ -6821,6 +6823,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
SKIP_BLANKS; |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
+ xmlStopParser(ctxt); |
||||||
|
+ return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, |
||||||
|
@@ -6876,6 +6880,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
} else { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL); |
||||||
|
+ xmlStopParser(ctxt); |
||||||
|
+ return; |
||||||
|
} |
||||||
|
|
||||||
|
if (RAW == 0) |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,39 @@ |
|||||||
|
From dfc5aae623e97336323e59a94450f1a708eb7c0c Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 15:04:09 +0800 |
||||||
|
Subject: [PATCH] Detect incoherency on GROW |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
the current pointer to the input has to be between the base and end |
||||||
|
if not stop everything we have an internal state error. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 9 ++++++++- |
||||||
|
1 file changed, 8 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 9aed98d..7602498 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2072,9 +2072,16 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) { |
||||||
|
((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputReadCallback) xmlNop)) && |
||||||
|
((ctxt->options & XML_PARSE_HUGE) == 0)) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
+ return; |
||||||
|
} |
||||||
|
xmlParserInputGrow(ctxt->input, INPUT_CHUNK); |
||||||
|
+ if ((ctxt->input->cur > ctxt->input->end) || |
||||||
|
+ (ctxt->input->cur < ctxt->input->base)) { |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
+ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound"); |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && |
||||||
|
(xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) |
||||||
|
xmlPopInput(ctxt); |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,34 @@ |
|||||||
|
commit 84b04b03bd6d31316fd5f0ad1c9cd31952671998 |
||||||
|
Author: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Tue Apr 22 15:30:56 2014 +0800 |
||||||
|
|
||||||
|
Do not fetch external parameter entities |
||||||
|
|
||||||
|
Unless explicitely asked for when validating or replacing entities |
||||||
|
with their value. Problem pointed out by Daniel Berrange <berrange@redhat.com> |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 3c72cbb..32f1475 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2622,6 +2622,20 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { |
||||||
|
xmlCharEncoding enc; |
||||||
|
|
||||||
|
/* |
||||||
|
+ * Note: external parsed entities will not be loaded, it is |
||||||
|
+ * not required for a non-validating parser, unless the |
||||||
|
+ * option of validating, or substituting entities were |
||||||
|
+ * given. Doing so is far more secure as the parser will |
||||||
|
+ * only process data coming from the document entity by |
||||||
|
+ * default. |
||||||
|
+ */ |
||||||
|
+ if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && |
||||||
|
+ ((ctxt->options & XML_PARSE_NOENT) == 0) && |
||||||
|
+ ((ctxt->options & XML_PARSE_DTDVALID) == 0) && |
||||||
|
+ (ctxt->validate == 0)) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
* handle the extra spaces added before and after |
||||||
|
* c.f. http://www.w3.org/TR/REC-xml#as-PE |
||||||
|
* this is done independently. |
@ -0,0 +1,31 @@ |
|||||||
|
From c5031779667ff362d670e34a42e9bc4f5a430793 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 15:01:22 +0800 |
||||||
|
Subject: [PATCH] Do not print error context when there is none |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
Which now happens more frequently du to xmlHaltParser use |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
error.c | 4 +++- |
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/error.c b/error.c |
||||||
|
index cbcf5c9..9c45040 100644 |
||||||
|
--- a/error.c |
||||||
|
+++ b/error.c |
||||||
|
@@ -177,7 +177,9 @@ xmlParserPrintFileContextInternal(xmlParserInputPtr input , |
||||||
|
xmlChar content[81]; /* space for 80 chars + line terminator */ |
||||||
|
xmlChar *ctnt; |
||||||
|
|
||||||
|
- if (input == NULL) return; |
||||||
|
+ if ((input == NULL) || (input->cur == NULL) || |
||||||
|
+ (*input->cur == 0)) return; |
||||||
|
+ |
||||||
|
cur = input->cur; |
||||||
|
base = input->base; |
||||||
|
/* skip backwards over any end-of-lines */ |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,38 @@ |
|||||||
|
From c171a25d614097e53ab84f64639de4dfbc197613 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 29 Jun 2015 16:10:26 +0800 |
||||||
|
Subject: [PATCH] Fail parsing early on if encoding conversion failed |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=751631 |
||||||
|
|
||||||
|
If we fail conversing the current input stream while |
||||||
|
processing the encoding declaration of the XMLDecl |
||||||
|
then it's safer to just abort there and not try to |
||||||
|
report further errors. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 6 +++++- |
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index dc14e5c..e2e0ad8 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -10415,7 +10415,11 @@ xmlParseEncodingDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
handler = xmlFindCharEncodingHandler((const char *) encoding); |
||||||
|
if (handler != NULL) { |
||||||
|
- xmlSwitchToEncoding(ctxt, handler); |
||||||
|
+ if (xmlSwitchToEncoding(ctxt, handler) < 0) { |
||||||
|
+ /* failed to convert */ |
||||||
|
+ ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING; |
||||||
|
+ return(NULL); |
||||||
|
+ } |
||||||
|
} else { |
||||||
|
xmlFatalErrMsgStr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, |
||||||
|
"Unsupported encoding %s\n", encoding); |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,129 @@ |
|||||||
|
From 268e6a3d615a14c6f6f1e8cf3d8c1e5c42ad1b41 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 10 May 2013 14:01:46 +0800 |
||||||
|
Subject: [PATCH] Fix a regression in xmlGetDocCompressMode() |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
The switch to xzlib had for consequence that the compression |
||||||
|
level of the input was not gathered anymore in ctxt->input->buf, |
||||||
|
then the parser compression flags was left to -1 and propagated |
||||||
|
to the resulting document. |
||||||
|
Fix the I/O layer to get compression detection in xzlib, |
||||||
|
then carry it in the input buffer and the resulting document |
||||||
|
|
||||||
|
This should fix |
||||||
|
https://lsbbugs.linuxfoundation.org/show_bug.cgi?id=3456 |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 4 ++++ |
||||||
|
xmlIO.c | 17 +++++++++++++++++ |
||||||
|
xzlib.c | 25 +++++++++++++++++++++++++ |
||||||
|
xzlib.h | 1 + |
||||||
|
4 files changed, 47 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index ee429f3..f30588c 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -10681,6 +10681,10 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { |
||||||
|
ctxt->sax->startDocument(ctxt->userData); |
||||||
|
if (ctxt->instate == XML_PARSER_EOF) |
||||||
|
return(-1); |
||||||
|
+ if ((ctxt->myDoc != NULL) && (ctxt->input != NULL) && |
||||||
|
+ (ctxt->input->buf != NULL) && (ctxt->input->buf->compressed >= 0)) { |
||||||
|
+ ctxt->myDoc->compression = ctxt->input->buf->compressed; |
||||||
|
+ } |
||||||
|
|
||||||
|
/* |
||||||
|
* The Misc part of the Prolog |
||||||
|
diff --git a/xmlIO.c b/xmlIO.c |
||||||
|
index 847cb7e..fc4e111 100644 |
||||||
|
--- a/xmlIO.c |
||||||
|
+++ b/xmlIO.c |
||||||
|
@@ -2669,6 +2669,12 @@ __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { |
||||||
|
#endif |
||||||
|
} |
||||||
|
#endif |
||||||
|
+#ifdef HAVE_LZMA_H |
||||||
|
+ if ((xmlInputCallbackTable[i].opencallback == xmlXzfileOpen) && |
||||||
|
+ (strcmp(URI, "-") != 0)) { |
||||||
|
+ ret->compressed = __libxml2_xzcompressed(context); |
||||||
|
+ } |
||||||
|
+#endif |
||||||
|
} |
||||||
|
else |
||||||
|
xmlInputCallbackTable[i].closecallback (context); |
||||||
|
@@ -3325,6 +3331,17 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { |
||||||
|
if (res < 0) { |
||||||
|
return(-1); |
||||||
|
} |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * try to establish compressed status of input if not done already |
||||||
|
+ */ |
||||||
|
+ if (in->compressed == -1) { |
||||||
|
+#ifdef HAVE_LZMA_H |
||||||
|
+ if (in->readcallback == xmlXzfileRead) |
||||||
|
+ in->compressed = __libxml2_xzcompressed(in->context); |
||||||
|
+#endif |
||||||
|
+ } |
||||||
|
+ |
||||||
|
len = res; |
||||||
|
if (in->encoder != NULL) { |
||||||
|
unsigned int use; |
||||||
|
diff --git a/xzlib.c b/xzlib.c |
||||||
|
index 928bd17..150e803 100644 |
||||||
|
--- a/xzlib.c |
||||||
|
+++ b/xzlib.c |
||||||
|
@@ -182,12 +182,37 @@ xz_open(const char *path, int fd, const char *mode ATTRIBUTE_UNUSED) |
||||||
|
return (xzFile) state; |
||||||
|
} |
||||||
|
|
||||||
|
+static int |
||||||
|
+xz_compressed(xzFile f) { |
||||||
|
+ xz_statep state; |
||||||
|
+ |
||||||
|
+ if (f == NULL) |
||||||
|
+ return(-1); |
||||||
|
+ state = (xz_statep) f; |
||||||
|
+ if (state->init <= 0) |
||||||
|
+ return(-1); |
||||||
|
+ |
||||||
|
+ switch (state->how) { |
||||||
|
+ case COPY: |
||||||
|
+ return(0); |
||||||
|
+ case GZIP: |
||||||
|
+ case LZMA: |
||||||
|
+ return(1); |
||||||
|
+ } |
||||||
|
+ return(-1); |
||||||
|
+} |
||||||
|
+ |
||||||
|
xzFile |
||||||
|
__libxml2_xzopen(const char *path, const char *mode) |
||||||
|
{ |
||||||
|
return xz_open(path, -1, mode); |
||||||
|
} |
||||||
|
|
||||||
|
+int |
||||||
|
+__libxml2_xzcompressed(xzFile f) { |
||||||
|
+ return xz_compressed(f); |
||||||
|
+} |
||||||
|
+ |
||||||
|
xzFile |
||||||
|
__libxml2_xzdopen(int fd, const char *mode) |
||||||
|
{ |
||||||
|
diff --git a/xzlib.h b/xzlib.h |
||||||
|
index 43c75e1..29ba55e 100644 |
||||||
|
--- a/xzlib.h |
||||||
|
+++ b/xzlib.h |
||||||
|
@@ -15,4 +15,5 @@ xzFile __libxml2_xzopen(const char *path, const char *mode); |
||||||
|
xzFile __libxml2_xzdopen(int fd, const char *mode); |
||||||
|
int __libxml2_xzread(xzFile file, void *buf, unsigned len); |
||||||
|
int __libxml2_xzclose(xzFile file); |
||||||
|
+int __libxml2_xzcompressed(xzFile f); |
||||||
|
#endif /* LIBXML2_XZLIB_H */ |
||||||
|
-- |
||||||
|
1.8.3.1 |
||||||
|
|
@ -0,0 +1,31 @@ |
|||||||
|
From 519455f1d543b1aa8f560dac03ec4127dfbab038 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Tue, 27 Oct 2015 10:53:44 +0800 |
||||||
|
Subject: [PATCH] Fix an error in previous Conditional section patch |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
an off by one mistake in the change, led to error on correct |
||||||
|
document where the end of the included entity was exactly |
||||||
|
the end of the conditional section, leading to regtest failure |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 4926ab0..b56d94c 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6896,7 +6896,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
NULL, NULL); |
||||||
|
} |
||||||
|
if ((ctxt-> instate != XML_PARSER_EOF) && |
||||||
|
- ((ctxt->input->cur + 3) < ctxt->input->end)) |
||||||
|
+ ((ctxt->input->cur + 3) <= ctxt->input->end)) |
||||||
|
SKIP(3); |
||||||
|
} |
||||||
|
} |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,47 @@ |
|||||||
|
From be24335cbc0019894e6222bd817e717c41550c3c Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 14 Mar 2016 17:19:44 +0800 |
||||||
|
Subject: [PATCH] Fix inappropriate fetch of entities content |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=761430 |
||||||
|
|
||||||
|
libfuzzer regression testing exposed another case where the parser would |
||||||
|
fetch content of an external entity while not in validating mode. |
||||||
|
Plug that hole |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 16 +++++++++++++++- |
||||||
|
1 file changed, 15 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 46ab0e8..1936599 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2854,7 +2854,21 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, |
||||||
|
ctxt->nbentities += ent->checked / 2; |
||||||
|
if (ent != NULL) { |
||||||
|
if (ent->content == NULL) { |
||||||
|
- xmlLoadEntityContent(ctxt, ent); |
||||||
|
+ /* |
||||||
|
+ * Note: external parsed entities will not be loaded, |
||||||
|
+ * it is not required for a non-validating parser to |
||||||
|
+ * complete external PEreferences coming from the |
||||||
|
+ * internal subset |
||||||
|
+ */ |
||||||
|
+ if (((ctxt->options & XML_PARSE_NOENT) != 0) || |
||||||
|
+ ((ctxt->options & XML_PARSE_DTDVALID) != 0) || |
||||||
|
+ (ctxt->validate != 0)) { |
||||||
|
+ xmlLoadEntityContent(ctxt, ent); |
||||||
|
+ } else { |
||||||
|
+ xmlWarningMsg(ctxt, XML_ERR_ENTITY_PROCESSING, |
||||||
|
+ "not validating will not read content for PE entity %s\n", |
||||||
|
+ ent->name, NULL); |
||||||
|
+ } |
||||||
|
} |
||||||
|
ctxt->depth++; |
||||||
|
rep = xmlStringDecodeEntities(ctxt, ent->content, what, |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,26 @@ |
|||||||
|
commit 27a93eff49526aacd34192258c19ff5d69d18c00 |
||||||
|
Author: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Thu Oct 23 11:35:36 2014 +0800 |
||||||
|
|
||||||
|
Fix missing entities after CVE-2014-3660 fix |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=738805 |
||||||
|
|
||||||
|
The fix for CVE-2014-3660 introduced a regression in some case |
||||||
|
where entity substitution is required and the entity is used |
||||||
|
first in anotther entity referenced from an attribute value |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index b58c2f0..f70d2b5 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -7226,7 +7226,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { |
||||||
|
* far more secure as the parser will only process data coming from |
||||||
|
* the document entity by default. |
||||||
|
*/ |
||||||
|
- if ((ent->checked == 0) && |
||||||
|
+ if (((ent->checked == 0) || |
||||||
|
+ ((ent->children == NULL) && (ctxt->options & XML_PARSE_NOENT))) && |
||||||
|
((ent->etype != XML_EXTERNAL_GENERAL_PARSED_ENTITY) || |
||||||
|
(ctxt->options & (XML_PARSE_NOENT | XML_PARSE_DTDVALID)))) { |
||||||
|
unsigned long oldnbent = ctxt->nbentities; |
@ -0,0 +1,68 @@ |
|||||||
|
From 466ef17b8cf8d68393f3a56cda8e7a5504aacf98 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 30 Oct 2015 21:14:55 +0800 |
||||||
|
Subject: [PATCH] Fix parsing short unclosed comment uninitialized access |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=746048 |
||||||
|
The HTML parser was too optimistic when processing comments and |
||||||
|
didn't check for the end of the stream on the first 2 characters |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
HTMLparser.c | 21 ++++++++++++++------- |
||||||
|
1 file changed, 14 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
diff --git a/HTMLparser.c b/HTMLparser.c |
||||||
|
index dd0c1ea..cab499a 100644 |
||||||
|
--- a/HTMLparser.c |
||||||
|
+++ b/HTMLparser.c |
||||||
|
@@ -3245,12 +3245,17 @@ htmlParseComment(htmlParserCtxtPtr ctxt) { |
||||||
|
ctxt->instate = state; |
||||||
|
return; |
||||||
|
} |
||||||
|
+ len = 0; |
||||||
|
+ buf[len] = 0; |
||||||
|
q = CUR_CHAR(ql); |
||||||
|
+ if (!IS_CHAR(q)) |
||||||
|
+ goto unfinished; |
||||||
|
NEXTL(ql); |
||||||
|
r = CUR_CHAR(rl); |
||||||
|
+ if (!IS_CHAR(r)) |
||||||
|
+ goto unfinished; |
||||||
|
NEXTL(rl); |
||||||
|
cur = CUR_CHAR(l); |
||||||
|
- len = 0; |
||||||
|
while (IS_CHAR(cur) && |
||||||
|
((cur != '>') || |
||||||
|
(r != '-') || (q != '-'))) { |
||||||
|
@@ -3281,18 +3286,20 @@ htmlParseComment(htmlParserCtxtPtr ctxt) { |
||||||
|
} |
||||||
|
} |
||||||
|
buf[len] = 0; |
||||||
|
- if (!IS_CHAR(cur)) { |
||||||
|
- htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, |
||||||
|
- "Comment not terminated \n<!--%.50s\n", buf, NULL); |
||||||
|
- xmlFree(buf); |
||||||
|
- } else { |
||||||
|
+ if (IS_CHAR(cur)) { |
||||||
|
NEXT; |
||||||
|
if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && |
||||||
|
(!ctxt->disableSAX)) |
||||||
|
ctxt->sax->comment(ctxt->userData, buf); |
||||||
|
xmlFree(buf); |
||||||
|
+ ctxt->instate = state; |
||||||
|
+ return; |
||||||
|
} |
||||||
|
- ctxt->instate = state; |
||||||
|
+ |
||||||
|
+unfinished: |
||||||
|
+ htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, |
||||||
|
+ "Comment not terminated \n<!--%.50s\n", buf, NULL); |
||||||
|
+ xmlFree(buf); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,57 @@ |
|||||||
|
commit 41b0d17368565b56677455be61b2c892bd665a27 |
||||||
|
Author: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Wed Jun 11 16:54:32 2014 +0800 |
||||||
|
|
||||||
|
Fix regressions introduced by CVE-2014-0191 patch |
||||||
|
|
||||||
|
A number of issues have been raised after the fix, and this patch |
||||||
|
tries to correct all of them, though most were related to |
||||||
|
postvalidation. |
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=730290 |
||||||
|
and other reports on list, off-list and on Red Hat bugzilla |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 32f1475..b58c2f0 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2622,8 +2622,8 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { |
||||||
|
xmlCharEncoding enc; |
||||||
|
|
||||||
|
/* |
||||||
|
- * Note: external parsed entities will not be loaded, it is |
||||||
|
- * not required for a non-validating parser, unless the |
||||||
|
+ * Note: external parameter entities will not be loaded, it |
||||||
|
+ * is not required for a non-validating parser, unless the |
||||||
|
* option of validating, or substituting entities were |
||||||
|
* given. Doing so is far more secure as the parser will |
||||||
|
* only process data coming from the document entity by |
||||||
|
@@ -2632,6 +2632,9 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { |
||||||
|
if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && |
||||||
|
((ctxt->options & XML_PARSE_NOENT) == 0) && |
||||||
|
((ctxt->options & XML_PARSE_DTDVALID) == 0) && |
||||||
|
+ ((ctxt->options & XML_PARSE_DTDLOAD) == 0) && |
||||||
|
+ ((ctxt->options & XML_PARSE_DTDATTR) == 0) && |
||||||
|
+ (ctxt->replaceEntities == 0) && |
||||||
|
(ctxt->validate == 0)) |
||||||
|
return; |
||||||
|
|
||||||
|
@@ -12643,6 +12646,9 @@ xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, |
||||||
|
return(NULL); |
||||||
|
} |
||||||
|
|
||||||
|
+ /* We are loading a DTD */ |
||||||
|
+ ctxt->options |= XML_PARSE_DTDLOAD; |
||||||
|
+ |
||||||
|
/* |
||||||
|
* Set-up the SAX context |
||||||
|
*/ |
||||||
|
@@ -12770,6 +12776,9 @@ xmlSAXParseDTD(xmlSAXHandlerPtr sax, const xmlChar *ExternalID, |
||||||
|
return(NULL); |
||||||
|
} |
||||||
|
|
||||||
|
+ /* We are loading a DTD */ |
||||||
|
+ ctxt->options |= XML_PARSE_DTDLOAD; |
||||||
|
+ |
||||||
|
/* |
||||||
|
* Set-up the SAX context |
||||||
|
*/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,41 @@ |
|||||||
|
From 6dfc7fd442351269c421a525d91506e43e18208e Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 15:06:02 +0800 |
||||||
|
Subject: [PATCH] Fix some loop issues embedding NEXT |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
Next can switch the parser back to XML_PARSER_EOF state, we |
||||||
|
need to consider those in loops consuming input |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 6 ++++-- |
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 7602498..cc45e17 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -2155,7 +2155,8 @@ xmlSkipBlankChars(xmlParserCtxtPtr ctxt) { |
||||||
|
int cur; |
||||||
|
do { |
||||||
|
cur = CUR; |
||||||
|
- while (IS_BLANK_CH(cur)) { /* CHECKED tstblanks.xml */ |
||||||
|
+ while ((IS_BLANK_CH(cur) && /* CHECKED tstblanks.xml */ |
||||||
|
+ (ctxt->instate != XML_PARSER_EOF))) { |
||||||
|
NEXT; |
||||||
|
cur = CUR; |
||||||
|
res++; |
||||||
|
@@ -2169,7 +2170,8 @@ xmlSkipBlankChars(xmlParserCtxtPtr ctxt) { |
||||||
|
* Need to handle support of entities branching here |
||||||
|
*/ |
||||||
|
if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); |
||||||
|
- } while (IS_BLANK(cur)); /* CHECKED tstblanks.xml */ |
||||||
|
+ } while ((IS_BLANK(cur)) && /* CHECKED tstblanks.xml */ |
||||||
|
+ (ctxt->instate != XML_PARSER_EOF)); |
||||||
|
} |
||||||
|
return(res); |
||||||
|
} |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,24 @@ |
|||||||
|
commit 498a54c26abd0fbd6f7d02b6b6f0275b4390d821 |
||||||
|
Author: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Tue Feb 9 12:55:29 2016 +0100 |
||||||
|
|
||||||
|
Heap-based buffer overread in xmlNextChar |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=759671 |
||||||
|
|
||||||
|
when the end of the internal subset isn't properly detected |
||||||
|
xmlParseInternalSubset should just return instead of trying |
||||||
|
to process input further. |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index f4fc310..b1215ca 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -8448,6 +8448,7 @@ xmlParseInternalSubset(xmlParserCtxtPtr ctxt) { |
||||||
|
*/ |
||||||
|
if (RAW != '>') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL); |
||||||
|
+ return; |
||||||
|
} |
||||||
|
NEXT; |
||||||
|
} |
@ -0,0 +1,119 @@ |
|||||||
|
From 7d23a33fbf8fe09fe52f9abafeafb9f438229603 Mon Sep 17 00:00:00 2001 |
||||||
|
From: David Kilzer <ddkilzer@apple.com> |
||||||
|
Date: Tue, 26 Jan 2016 16:57:03 -0800 |
||||||
|
Subject: [PATCH] Heap-based buffer-underreads due to xmlParseName |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=759573 |
||||||
|
|
||||||
|
* parser.c: |
||||||
|
(xmlParseElementDecl): Return early on invalid input to fix |
||||||
|
non-minimized test case (759573-2.xml). Otherwise the parser |
||||||
|
gets into a bad state in SKIP(3) at the end of the function. |
||||||
|
(xmlParseConditionalSections): Halt parsing when hitting invalid |
||||||
|
input that would otherwise caused xmlParserHandlePEReference() |
||||||
|
to recurse unexpectedly. This fixes the minimized test case |
||||||
|
(759573.xml). |
||||||
|
|
||||||
|
* result/errors/759573-2.xml: Add. |
||||||
|
* result/errors/759573-2.xml.err: Add. |
||||||
|
* result/errors/759573-2.xml.str: Add. |
||||||
|
* result/errors/759573.xml: Add. |
||||||
|
* result/errors/759573.xml.err: Add. |
||||||
|
* result/errors/759573.xml.str: Add. |
||||||
|
* test/errors/759573-2.xml: Add. |
||||||
|
* test/errors/759573.xml: Add. |
||||||
|
|
||||||
|
Had to fixup by removing test 759573-2 |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 2 ++ |
||||||
|
result/errors/759573.xml | 0 |
||||||
|
result/errors/759573.xml.err | 31 +++++++++++++++++++++++++++++++ |
||||||
|
result/errors/759573.xml.str | 4 ++++ |
||||||
|
test/errors/759573.xml | 1 + |
||||||
|
5 files changed, 38 insertions(+) |
||||||
|
create mode 100644 result/errors/759573.xml |
||||||
|
create mode 100644 result/errors/759573.xml.err |
||||||
|
create mode 100644 result/errors/759573.xml.str |
||||||
|
create mode 100644 test/errors/759573.xml |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 133df95..0accf54 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6683,6 +6683,7 @@ xmlParseElementDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
if (!IS_BLANK_CH(CUR)) { |
||||||
|
xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
||||||
|
"Space required after 'ELEMENT'\n"); |
||||||
|
+ return(-1); |
||||||
|
} |
||||||
|
SKIP_BLANKS; |
||||||
|
name = xmlParseName(ctxt); |
||||||
|
@@ -6834,6 +6835,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
diff --git a/result/errors/759573.xml.err b/result/errors/759573.xml.err |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..2c21e9a |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/errors/759573.xml.err |
||||||
|
@@ -0,0 +1,31 @@ |
||||||
|
+./test/errors/759573.xml:1: parser error : Space required after '<!ENTITY' |
||||||
|
+ELEMENT t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITY |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml:1: parser error : Space required after the entity name |
||||||
|
+LEMENT t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml:1: parser error : Entity value required |
||||||
|
+LEMENT t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz |
||||||
|
+ ^ |
||||||
|
+Entity: line 1: parser error : PEReference: no name |
||||||
|
+ %xx; |
||||||
|
+ ^ |
||||||
|
+Entity: line 1: |
||||||
|
+%<![INCLUDE[000%ஸ000%z; |
||||||
|
+ ^ |
||||||
|
+Entity: line 1: parser error : Content error in the external subset |
||||||
|
+ %xx; |
||||||
|
+ ^ |
||||||
|
+Entity: line 1: |
||||||
|
+%<![INCLUDE[000%ஸ000%z; |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml:1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration |
||||||
|
+ |
||||||
|
+T t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz>%xx; |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml:1: parser error : DOCTYPE improperly terminated |
||||||
|
+T t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz>%xx; |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml:1: parser error : Start tag expected, '<' not found |
||||||
|
+T t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz>%xx; |
||||||
|
+ ^ |
||||||
|
diff --git a/result/errors/759573.xml.str b/result/errors/759573.xml.str |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..1b6addb |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/errors/759573.xml.str |
||||||
|
@@ -0,0 +1,4 @@ |
||||||
|
+./test/errors/759573.xml:1: parser error : Extra content at the end of the document |
||||||
|
+<?h?><!DOCTYPEt[<!ELEMENT t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ00 |
||||||
|
+ ^ |
||||||
|
+./test/errors/759573.xml : failed to parse |
||||||
|
diff --git a/test/errors/759573.xml b/test/errors/759573.xml |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..69ebb57 |
||||||
|
--- /dev/null |
||||||
|
+++ b/test/errors/759573.xml |
||||||
|
@@ -0,0 +1 @@ |
||||||
|
+<?h?><!DOCTYPEt[<!ELEMENT t (A)><!ENTITY % xx '%<![INCLUDE[000%ஸ000%z;'><!ENTITYz>%xx; |
||||||
|
\ No newline at end of file |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,143 @@ |
|||||||
|
From 7012970b0d005f440e8326e37844a834f67a8c64 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pranjal Jumde <pjumde@apple.com> |
||||||
|
Date: Wed, 2 Mar 2016 15:52:24 -0800 |
||||||
|
Subject: [PATCH] Heap use-after-free in htmlParsePubidLiteral and |
||||||
|
htmlParseSystemiteral |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=760263 |
||||||
|
|
||||||
|
* HTMLparser.c: Add BASE_PTR convenience macro. |
||||||
|
(htmlParseSystemLiteral): Store length and start position instead |
||||||
|
of a pointer while iterating through the public identifier since |
||||||
|
the underlying buffer may change, resulting in a stale pointer |
||||||
|
being used. |
||||||
|
(htmlParsePubidLiteral): Ditto. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
HTMLparser.c | 58 +++++++++++++++++++++++++++++++++++++++++++--------------- |
||||||
|
1 file changed, 43 insertions(+), 15 deletions(-) |
||||||
|
|
||||||
|
diff --git a/HTMLparser.c b/HTMLparser.c |
||||||
|
index a897cb0..e7d802d 100644 |
||||||
|
--- a/HTMLparser.c |
||||||
|
+++ b/HTMLparser.c |
||||||
|
@@ -303,6 +303,7 @@ htmlNodeInfoPop(htmlParserCtxtPtr ctxt) |
||||||
|
#define UPP(val) (toupper(ctxt->input->cur[(val)])) |
||||||
|
|
||||||
|
#define CUR_PTR ctxt->input->cur |
||||||
|
+#define BASE_PTR ctxt->input->base |
||||||
|
|
||||||
|
#define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ |
||||||
|
(ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ |
||||||
|
@@ -2773,31 +2774,43 @@ htmlParseAttValue(htmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
static xmlChar * |
||||||
|
htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { |
||||||
|
- const xmlChar *q; |
||||||
|
+ size_t len = 0, startPosition = 0; |
||||||
|
xmlChar *ret = NULL; |
||||||
|
|
||||||
|
if (CUR == '"') { |
||||||
|
NEXT; |
||||||
|
- q = CUR_PTR; |
||||||
|
- while ((IS_CHAR_CH(CUR)) && (CUR != '"')) |
||||||
|
+ |
||||||
|
+ if (CUR_PTR < BASE_PTR) |
||||||
|
+ return(ret); |
||||||
|
+ startPosition = CUR_PTR - BASE_PTR; |
||||||
|
+ |
||||||
|
+ while ((IS_CHAR_CH(CUR)) && (CUR != '"')) { |
||||||
|
NEXT; |
||||||
|
+ len++; |
||||||
|
+ } |
||||||
|
if (!IS_CHAR_CH(CUR)) { |
||||||
|
htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, |
||||||
|
"Unfinished SystemLiteral\n", NULL, NULL); |
||||||
|
} else { |
||||||
|
- ret = xmlStrndup(q, CUR_PTR - q); |
||||||
|
+ ret = xmlStrndup((BASE_PTR+startPosition), len); |
||||||
|
NEXT; |
||||||
|
} |
||||||
|
} else if (CUR == '\'') { |
||||||
|
NEXT; |
||||||
|
- q = CUR_PTR; |
||||||
|
- while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) |
||||||
|
+ |
||||||
|
+ if (CUR_PTR < BASE_PTR) |
||||||
|
+ return(ret); |
||||||
|
+ startPosition = CUR_PTR - BASE_PTR; |
||||||
|
+ |
||||||
|
+ while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) { |
||||||
|
NEXT; |
||||||
|
+ len++; |
||||||
|
+ } |
||||||
|
if (!IS_CHAR_CH(CUR)) { |
||||||
|
htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, |
||||||
|
"Unfinished SystemLiteral\n", NULL, NULL); |
||||||
|
} else { |
||||||
|
- ret = xmlStrndup(q, CUR_PTR - q); |
||||||
|
+ ret = xmlStrndup((BASE_PTR+startPosition), len); |
||||||
|
NEXT; |
||||||
|
} |
||||||
|
} else { |
||||||
|
@@ -2821,32 +2834,47 @@ htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
static xmlChar * |
||||||
|
htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { |
||||||
|
- const xmlChar *q; |
||||||
|
+ size_t len = 0, startPosition = 0; |
||||||
|
xmlChar *ret = NULL; |
||||||
|
/* |
||||||
|
* Name ::= (Letter | '_') (NameChar)* |
||||||
|
*/ |
||||||
|
if (CUR == '"') { |
||||||
|
NEXT; |
||||||
|
- q = CUR_PTR; |
||||||
|
- while (IS_PUBIDCHAR_CH(CUR)) NEXT; |
||||||
|
+ |
||||||
|
+ if (CUR_PTR < BASE_PTR) |
||||||
|
+ return(ret); |
||||||
|
+ startPosition = CUR_PTR - BASE_PTR; |
||||||
|
+ |
||||||
|
+ while (IS_PUBIDCHAR_CH(CUR)) { |
||||||
|
+ len++; |
||||||
|
+ NEXT; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (CUR != '"') { |
||||||
|
htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, |
||||||
|
"Unfinished PubidLiteral\n", NULL, NULL); |
||||||
|
} else { |
||||||
|
- ret = xmlStrndup(q, CUR_PTR - q); |
||||||
|
+ ret = xmlStrndup((BASE_PTR + startPosition), len); |
||||||
|
NEXT; |
||||||
|
} |
||||||
|
} else if (CUR == '\'') { |
||||||
|
NEXT; |
||||||
|
- q = CUR_PTR; |
||||||
|
- while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')) |
||||||
|
- NEXT; |
||||||
|
+ |
||||||
|
+ if (CUR_PTR < BASE_PTR) |
||||||
|
+ return(ret); |
||||||
|
+ startPosition = CUR_PTR - BASE_PTR; |
||||||
|
+ |
||||||
|
+ while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')){ |
||||||
|
+ len++; |
||||||
|
+ NEXT; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (CUR != '\'') { |
||||||
|
htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, |
||||||
|
"Unfinished PubidLiteral\n", NULL, NULL); |
||||||
|
} else { |
||||||
|
- ret = xmlStrndup(q, CUR_PTR - q); |
||||||
|
+ ret = xmlStrndup((BASE_PTR + startPosition), len); |
||||||
|
NEXT; |
||||||
|
} |
||||||
|
} else { |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,156 @@ |
|||||||
|
From 7eca8fef0d19c65bd2004ba73347575a38e8d08e Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pranjal Jumde <pjumde@apple.com> |
||||||
|
Date: Mon, 7 Mar 2016 14:04:08 -0800 |
||||||
|
Subject: [PATCH] Heap use-after-free in xmlSAX2AttributeNs |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=759020 |
||||||
|
|
||||||
|
* parser.c: |
||||||
|
(xmlParseStartTag2): Attribute strings are only valid if the |
||||||
|
base does not change, so add another check where the base may |
||||||
|
change. Make sure to set 'attvalue' to NULL after freeing it. |
||||||
|
* result/errors/759020.xml: Added. |
||||||
|
* result/errors/759020.xml.err: Added. |
||||||
|
* result/errors/759020.xml.str: Added. |
||||||
|
* test/errors/759020.xml: Added test case. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 26 +++++++++++++++++++++++-- |
||||||
|
result/errors/759020.xml | 0 |
||||||
|
result/errors/759020.xml.err | 6 ++++++ |
||||||
|
result/errors/759020.xml.str | 7 +++++++ |
||||||
|
test/errors/759020.xml | 46 ++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
5 files changed, 83 insertions(+), 2 deletions(-) |
||||||
|
create mode 100644 result/errors/759020.xml |
||||||
|
create mode 100644 result/errors/759020.xml.err |
||||||
|
create mode 100644 result/errors/759020.xml.str |
||||||
|
create mode 100644 test/errors/759020.xml |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 1936599..133df95 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -9438,8 +9438,20 @@ reparse: |
||||||
|
else |
||||||
|
if (nsPush(ctxt, NULL, URL) > 0) nbNs++; |
||||||
|
skip_default_ns: |
||||||
|
- if (alloc != 0) xmlFree(attvalue); |
||||||
|
+ if ((attvalue != NULL) && (alloc != 0)) { |
||||||
|
+ xmlFree(attvalue); |
||||||
|
+ attvalue = NULL; |
||||||
|
+ } |
||||||
|
+ if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
||||||
|
+ break; |
||||||
|
+ if (!IS_BLANK_CH(RAW)) { |
||||||
|
+ xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
||||||
|
+ "attributes construct error\n"); |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
SKIP_BLANKS; |
||||||
|
+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
+ goto base_changed; |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (aprefix == ctxt->str_xmlns) { |
||||||
|
@@ -9511,7 +9523,17 @@ skip_default_ns: |
||||||
|
else |
||||||
|
if (nsPush(ctxt, attname, URL) > 0) nbNs++; |
||||||
|
skip_ns: |
||||||
|
- if (alloc != 0) xmlFree(attvalue); |
||||||
|
+ if ((attvalue != NULL) && (alloc != 0)) { |
||||||
|
+ xmlFree(attvalue); |
||||||
|
+ attvalue = NULL; |
||||||
|
+ } |
||||||
|
+ if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
||||||
|
+ break; |
||||||
|
+ if (!IS_BLANK_CH(RAW)) { |
||||||
|
+ xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
||||||
|
+ "attributes construct error\n"); |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
SKIP_BLANKS; |
||||||
|
if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
||||||
|
goto base_changed; |
||||||
|
diff --git a/result/errors/759020.xml.err b/result/errors/759020.xml.err |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..a0d3051 |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/errors/759020.xml.err |
||||||
|
@@ -0,0 +1,6 @@ |
||||||
|
+./test/errors/759020.xml:3: namespace warning : xmlns: URI 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 is not absolute |
||||||
|
+0000000000000000000000000000000000000000000000000000000000000000000000000000000' |
||||||
|
+ ^ |
||||||
|
+./test/errors/759020.xml:46: parser error : Couldn't find end of Start Tag s00 line 2 |
||||||
|
+ |
||||||
|
+ ^ |
||||||
|
diff --git a/result/errors/759020.xml.str b/result/errors/759020.xml.str |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..998d6d2 |
||||||
|
--- /dev/null |
||||||
|
+++ b/result/errors/759020.xml.str |
||||||
|
@@ -0,0 +1,7 @@ |
||||||
|
+./test/errors/759020.xml:3: namespace warning : xmlns: URI 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 is not absolute |
||||||
|
+0000000000000000000000000000000000000000000000000000000000000000000000000000000' |
||||||
|
+ ^ |
||||||
|
+./test/errors/759020.xml:46: parser error : Couldn't find end of Start Tag s00 |
||||||
|
+ |
||||||
|
+ ^ |
||||||
|
+./test/errors/759020.xml : failed to parse |
||||||
|
diff --git a/test/errors/759020.xml b/test/errors/759020.xml |
||||||
|
new file mode 100644 |
||||||
|
index 0000000..db23275 |
||||||
|
--- /dev/null |
||||||
|
+++ b/test/errors/759020.xml |
||||||
|
@@ -0,0 +1,46 @@ |
||||||
|
+<?l 00000000000000000000000000000?> |
||||||
|
+<s00 w0000="000" h00000="000" |
||||||
|
+ xmlns = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
\ No newline at end of file |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,208 @@ |
|||||||
|
From 6a2a4e753bbba26b2de3d32f11c28691bec967dc Mon Sep 17 00:00:00 2001 |
||||||
|
From: David Kilzer <ddkilzer@apple.com> |
||||||
|
Date: Mon, 23 May 2016 14:58:41 +0800 |
||||||
|
Subject: [PATCH] More format string warnings with possible format string |
||||||
|
vulnerability |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=761029 |
||||||
|
|
||||||
|
adds a new xmlEscapeFormatString() function to escape composed format |
||||||
|
strings |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
libxml.h | 3 +++ |
||||||
|
relaxng.c | 3 ++- |
||||||
|
xmlschemas.c | 39 ++++++++++++++++++++++++++------------- |
||||||
|
xmlstring.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
4 files changed, 86 insertions(+), 14 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libxml.h b/libxml.h |
||||||
|
index 4558b70..88e515f 100644 |
||||||
|
--- a/libxml.h |
||||||
|
+++ b/libxml.h |
||||||
|
@@ -9,6 +9,8 @@ |
||||||
|
#ifndef __XML_LIBXML_H__ |
||||||
|
#define __XML_LIBXML_H__ |
||||||
|
|
||||||
|
+#include <libxml/xmlstring.h> |
||||||
|
+ |
||||||
|
#ifndef NO_LARGEFILE_SOURCE |
||||||
|
#ifndef _LARGEFILE_SOURCE |
||||||
|
#define _LARGEFILE_SOURCE |
||||||
|
@@ -93,6 +95,7 @@ int __xmlInitializeDict(void); |
||||||
|
int __xmlRandom(void); |
||||||
|
#endif |
||||||
|
|
||||||
|
+XMLPUBFUN xmlChar * XMLCALL xmlEscapeFormatString(xmlChar **msg); |
||||||
|
int xmlNop(void); |
||||||
|
|
||||||
|
#ifdef IN_LIBXML |
||||||
|
diff --git a/relaxng.c b/relaxng.c |
||||||
|
index b531081..99e9901 100644 |
||||||
|
--- a/relaxng.c |
||||||
|
+++ b/relaxng.c |
||||||
|
@@ -2215,7 +2215,8 @@ xmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1, |
||||||
|
snprintf(msg, 1000, "Unknown error code %d\n", err); |
||||||
|
} |
||||||
|
msg[1000 - 1] = 0; |
||||||
|
- return (xmlStrdup((xmlChar *) msg)); |
||||||
|
+ xmlChar *result = xmlCharStrdup(msg); |
||||||
|
+ return (xmlEscapeFormatString(&result)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
diff --git a/xmlschemas.c b/xmlschemas.c |
||||||
|
index 398cdd8..1bcb0f0 100644 |
||||||
|
--- a/xmlschemas.c |
||||||
|
+++ b/xmlschemas.c |
||||||
|
@@ -1769,7 +1769,7 @@ xmlSchemaFormatItemForReport(xmlChar **buf, |
||||||
|
} |
||||||
|
FREE_AND_NULL(str) |
||||||
|
|
||||||
|
- return (*buf); |
||||||
|
+ return (xmlEscapeFormatString(buf)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
@@ -2247,6 +2247,13 @@ xmlSchemaFormatNodeForError(xmlChar ** msg, |
||||||
|
TODO |
||||||
|
return (NULL); |
||||||
|
} |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * xmlSchemaFormatItemForReport() also returns an escaped format |
||||||
|
+ * string, so do this before calling it below (in the future). |
||||||
|
+ */ |
||||||
|
+ xmlEscapeFormatString(msg); |
||||||
|
+ |
||||||
|
/* |
||||||
|
* VAL TODO: The output of the given schema component is currently |
||||||
|
* disabled. |
||||||
|
@@ -2474,11 +2481,13 @@ xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt, |
||||||
|
msg = xmlStrcat(msg, BAD_CAST " '"); |
||||||
|
if (type->builtInType != 0) { |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "xs:"); |
||||||
|
- msg = xmlStrcat(msg, type->name); |
||||||
|
- } else |
||||||
|
- msg = xmlStrcat(msg, |
||||||
|
- xmlSchemaFormatQName(&str, |
||||||
|
- type->targetNamespace, type->name)); |
||||||
|
+ str = xmlStrdup(type->name); |
||||||
|
+ } else { |
||||||
|
+ const xmlChar *qName = xmlSchemaFormatQName(&str, type->targetNamespace, type->name); |
||||||
|
+ if (!str) |
||||||
|
+ str = xmlStrdup(qName); |
||||||
|
+ } |
||||||
|
+ msg = xmlStrcat(msg, xmlEscapeFormatString(&str)); |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "'"); |
||||||
|
FREE_AND_NULL(str); |
||||||
|
} |
||||||
|
@@ -2615,7 +2624,7 @@ xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt, |
||||||
|
str = xmlStrcat(str, BAD_CAST ", "); |
||||||
|
} |
||||||
|
str = xmlStrcat(str, BAD_CAST " ).\n"); |
||||||
|
- msg = xmlStrcat(msg, BAD_CAST str); |
||||||
|
+ msg = xmlStrcat(msg, xmlEscapeFormatString(&str)); |
||||||
|
FREE_AND_NULL(str) |
||||||
|
} else |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "\n"); |
||||||
|
@@ -3139,11 +3148,13 @@ xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt, |
||||||
|
msg = xmlStrcat(msg, BAD_CAST " '"); |
||||||
|
if (type->builtInType != 0) { |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "xs:"); |
||||||
|
- msg = xmlStrcat(msg, type->name); |
||||||
|
- } else |
||||||
|
- msg = xmlStrcat(msg, |
||||||
|
- xmlSchemaFormatQName(&str, |
||||||
|
- type->targetNamespace, type->name)); |
||||||
|
+ str = xmlStrdup(type->name); |
||||||
|
+ } else { |
||||||
|
+ const xmlChar *qName = xmlSchemaFormatQName(&str, type->targetNamespace, type->name); |
||||||
|
+ if (!str) |
||||||
|
+ str = xmlStrdup(qName); |
||||||
|
+ } |
||||||
|
+ msg = xmlStrcat(msg, xmlEscapeFormatString(&str)); |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "'."); |
||||||
|
FREE_AND_NULL(str); |
||||||
|
} |
||||||
|
@@ -3156,7 +3167,9 @@ xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt, |
||||||
|
} |
||||||
|
if (expected) { |
||||||
|
msg = xmlStrcat(msg, BAD_CAST " Expected is '"); |
||||||
|
- msg = xmlStrcat(msg, BAD_CAST expected); |
||||||
|
+ xmlChar *expectedEscaped = xmlCharStrdup(expected); |
||||||
|
+ msg = xmlStrcat(msg, xmlEscapeFormatString(&expectedEscaped)); |
||||||
|
+ FREE_AND_NULL(expectedEscaped); |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "'.\n"); |
||||||
|
} else |
||||||
|
msg = xmlStrcat(msg, BAD_CAST "\n"); |
||||||
|
diff --git a/xmlstring.c b/xmlstring.c |
||||||
|
index c66eef3..9164d2e 100644 |
||||||
|
--- a/xmlstring.c |
||||||
|
+++ b/xmlstring.c |
||||||
|
@@ -987,5 +987,60 @@ xmlUTF8Strsub(const xmlChar *utf, int start, int len) { |
||||||
|
return(xmlUTF8Strndup(utf, len)); |
||||||
|
} |
||||||
|
|
||||||
|
+/** |
||||||
|
+ * xmlEscapeFormatString: |
||||||
|
+ * @msg: a pointer to the string in which to escape '%' characters. |
||||||
|
+ * Must be a heap-allocated buffer created by libxml2 that may be |
||||||
|
+ * returned, or that may be freed and replaced. |
||||||
|
+ * |
||||||
|
+ * Replaces the string pointed to by 'msg' with an escaped string. |
||||||
|
+ * Returns the same string with all '%' characters escaped. |
||||||
|
+ */ |
||||||
|
+xmlChar * |
||||||
|
+xmlEscapeFormatString(xmlChar **msg) |
||||||
|
+{ |
||||||
|
+ xmlChar *msgPtr = NULL; |
||||||
|
+ xmlChar *result = NULL; |
||||||
|
+ xmlChar *resultPtr = NULL; |
||||||
|
+ size_t count = 0; |
||||||
|
+ size_t msgLen = 0; |
||||||
|
+ size_t resultLen = 0; |
||||||
|
+ |
||||||
|
+ if (!msg || !*msg) |
||||||
|
+ return(NULL); |
||||||
|
+ |
||||||
|
+ for (msgPtr = *msg; *msgPtr != '\0'; ++msgPtr) { |
||||||
|
+ ++msgLen; |
||||||
|
+ if (*msgPtr == '%') |
||||||
|
+ ++count; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (count == 0) |
||||||
|
+ return(*msg); |
||||||
|
+ |
||||||
|
+ resultLen = msgLen + count + 1; |
||||||
|
+ result = (xmlChar *) xmlMallocAtomic(resultLen * sizeof(xmlChar)); |
||||||
|
+ if (result == NULL) { |
||||||
|
+ /* Clear *msg to prevent format string vulnerabilities in |
||||||
|
+ out-of-memory situations. */ |
||||||
|
+ xmlFree(*msg); |
||||||
|
+ *msg = NULL; |
||||||
|
+ xmlErrMemory(NULL, NULL); |
||||||
|
+ return(NULL); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ for (msgPtr = *msg, resultPtr = result; *msgPtr != '\0'; ++msgPtr, ++resultPtr) { |
||||||
|
+ *resultPtr = *msgPtr; |
||||||
|
+ if (*msgPtr == '%') |
||||||
|
+ *(++resultPtr) = '%'; |
||||||
|
+ } |
||||||
|
+ result[resultLen - 1] = '\0'; |
||||||
|
+ |
||||||
|
+ xmlFree(*msg); |
||||||
|
+ *msg = result; |
||||||
|
+ |
||||||
|
+ return *msg; |
||||||
|
+} |
||||||
|
+ |
||||||
|
#define bottom_xmlstring |
||||||
|
#include "elfgcchack.h" |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,178 @@ |
|||||||
|
From 586849318286965d6ede2932ccd31176b4f7fe81 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Fri, 20 Nov 2015 14:59:30 +0800 |
||||||
|
Subject: [PATCH] Reuse xmlHaltParser() where it makes sense |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
Unify the various place where either xmlStopParser was called |
||||||
|
(which resets the error as a side effect) and places where we |
||||||
|
used ctxt->instate = XML_PARSER_EOF to stop further processing |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 37 +++++++++++++++++-------------------- |
||||||
|
1 file changed, 17 insertions(+), 20 deletions(-) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 5b4f719..9aed98d 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -1773,7 +1773,7 @@ nodePush(xmlParserCtxtPtr ctxt, xmlNodePtr value) |
||||||
|
xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, |
||||||
|
"Excessive depth in document: %d use XML_PARSE_HUGE option\n", |
||||||
|
xmlParserMaxDepth); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return(-1); |
||||||
|
} |
||||||
|
ctxt->nodeTab[ctxt->nodeNr] = value; |
||||||
|
@@ -5655,7 +5655,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
if (RAW != '>') { |
||||||
|
xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, |
||||||
|
"xmlParseEntityDecl: entity %s not terminated\n", name); |
||||||
|
- xmlStopParser(ctxt); |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
} else { |
||||||
|
if (input != ctxt->input) { |
||||||
|
xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, |
||||||
|
@@ -6767,8 +6767,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
SKIP_BLANKS; |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
- xmlStopParser(ctxt); |
||||||
|
- ctxt->errNo = XML_ERR_CONDSEC_INVALID; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
@@ -6830,8 +6829,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
SKIP_BLANKS; |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
- xmlStopParser(ctxt); |
||||||
|
- ctxt->errNo = XML_ERR_CONDSEC_INVALID; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
@@ -6888,8 +6886,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
|
||||||
|
} else { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL); |
||||||
|
- xmlStopParser(ctxt); |
||||||
|
- ctxt->errNo = XML_ERR_CONDSEC_INVALID_KEYWORD; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -7100,7 +7097,7 @@ xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, |
||||||
|
/* |
||||||
|
* The XML REC instructs us to stop parsing right here |
||||||
|
*/ |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
@@ -8087,7 +8084,7 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) |
||||||
|
* The XML REC instructs us to stop parsing |
||||||
|
* right here |
||||||
|
*/ |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
@@ -9986,7 +9983,7 @@ xmlParseContent(xmlParserCtxtPtr ctxt) { |
||||||
|
if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, |
||||||
|
"detected an error in element content\n"); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
@@ -10021,7 +10018,7 @@ xmlParseElement(xmlParserCtxtPtr ctxt) { |
||||||
|
xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, |
||||||
|
"Excessive depth in document: %d use XML_PARSE_HUGE option\n", |
||||||
|
xmlParserMaxDepth); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -11345,7 +11342,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
ctxt->sax->setDocumentLocator(ctxt->userData, |
||||||
|
&xmlDefaultSAXLocator); |
||||||
|
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
#ifdef DEBUG_PUSH |
||||||
|
xmlGenericError(xmlGenericErrorContext, |
||||||
|
"PP: entering EOF\n"); |
||||||
|
@@ -11378,7 +11375,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
* The XML REC instructs us to stop parsing right |
||||||
|
* here |
||||||
|
*/ |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return(0); |
||||||
|
} |
||||||
|
ctxt->standalone = ctxt->input->standalone; |
||||||
|
@@ -11434,7 +11431,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
cur = ctxt->input->cur[0]; |
||||||
|
if (cur != '<') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
||||||
|
ctxt->sax->endDocument(ctxt->userData); |
||||||
|
goto done; |
||||||
|
@@ -11466,7 +11463,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
goto done; |
||||||
|
if (name == NULL) { |
||||||
|
spacePop(ctxt); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
||||||
|
ctxt->sax->endDocument(ctxt->userData); |
||||||
|
goto done; |
||||||
|
@@ -11633,7 +11630,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, |
||||||
|
"detected an error in element content\n"); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
break; |
||||||
|
} |
||||||
|
break; |
||||||
|
@@ -11954,7 +11951,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { |
||||||
|
goto done; |
||||||
|
} else { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
#ifdef DEBUG_PUSH |
||||||
|
xmlGenericError(xmlGenericErrorContext, |
||||||
|
"PP: entering EOF\n"); |
||||||
|
@@ -12318,7 +12315,7 @@ xmldecl_done: |
||||||
|
res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); |
||||||
|
if (res < 0) { |
||||||
|
ctxt->errNo = XML_PARSER_EOF; |
||||||
|
- ctxt->disableSAX = 1; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
return (XML_PARSER_EOF); |
||||||
|
} |
||||||
|
xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); |
||||||
|
@@ -12372,7 +12369,7 @@ xmldecl_done: |
||||||
|
((ctxt->input->cur - ctxt->input->base) > XML_MAX_LOOKUP_LIMIT)) && |
||||||
|
((ctxt->options & XML_PARSE_HUGE) == 0)) { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); |
||||||
|
- ctxt->instate = XML_PARSER_EOF; |
||||||
|
+ xmlHaltParser(ctxt); |
||||||
|
} |
||||||
|
if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) |
||||||
|
return(ctxt->errNo); |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
From f0dbfaebd1a4a647ed1902ca16839ecfcb89c422 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 23 Feb 2015 11:17:35 +0800 |
||||||
|
Subject: [PATCH] Stop parsing on entities boundaries errors |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
For https://bugzilla.gnome.org/show_bug.cgi?id=744980 |
||||||
|
|
||||||
|
There are times, like on unterminated entities that it's preferable to |
||||||
|
stop parsing, even if that means less error reporting. Entities are |
||||||
|
feeding the parser on further processing, and if they are ill defined |
||||||
|
then it's possible to get the parser to bug. Also do the same on |
||||||
|
Conditional Sections if the input is broken, as the structure of |
||||||
|
the document can't be guessed. |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index f70d2b5..d790f8e 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -5649,6 +5649,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { |
||||||
|
if (RAW != '>') { |
||||||
|
xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, |
||||||
|
"xmlParseEntityDecl: entity %s not terminated\n", name); |
||||||
|
+ xmlStopParser(ctxt); |
||||||
|
} else { |
||||||
|
if (input != ctxt->input) { |
||||||
|
xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,24 @@ |
|||||||
|
*** XML/xml2-config.in.orig 2006-06-06 16:35:56.000000000 +0200 |
||||||
|
--- XML/xml2-config.in 2006-06-06 16:36:24.000000000 +0200 |
||||||
|
*************** |
||||||
|
*** 3,9 **** |
||||||
|
prefix=@prefix@ |
||||||
|
exec_prefix=@exec_prefix@ |
||||||
|
includedir=@includedir@ |
||||||
|
! libdir=@libdir@ |
||||||
|
|
||||||
|
usage() |
||||||
|
{ |
||||||
|
--- 3,14 ---- |
||||||
|
prefix=@prefix@ |
||||||
|
exec_prefix=@exec_prefix@ |
||||||
|
includedir=@includedir@ |
||||||
|
! if [ "`ldd /bin/sh | grep lib64`" = "" ] |
||||||
|
! then |
||||||
|
! libdir=${exec_prefix}/lib |
||||||
|
! else |
||||||
|
! libdir=${exec_prefix}/lib64 |
||||||
|
! fi |
||||||
|
|
||||||
|
usage() |
||||||
|
{ |
@ -0,0 +1,44 @@ |
|||||||
|
From 5b3397ee81277ed70af58a247a0d731de9c7a6c7 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Daniel Veillard <veillard@redhat.com> |
||||||
|
Date: Mon, 9 Nov 2015 18:16:00 +0800 |
||||||
|
Subject: [PATCH] xmlStopParser reset errNo |
||||||
|
To: libvir-list@redhat.com |
||||||
|
|
||||||
|
I had used it in contexts where that information ought to be preserved |
||||||
|
|
||||||
|
Signed-off-by: Daniel Veillard <veillard@redhat.com> |
||||||
|
--- |
||||||
|
parser.c | 3 +++ |
||||||
|
1 file changed, 3 insertions(+) |
||||||
|
|
||||||
|
diff --git a/parser.c b/parser.c |
||||||
|
index 134ea7f..a58dda3 100644 |
||||||
|
--- a/parser.c |
||||||
|
+++ b/parser.c |
||||||
|
@@ -6762,6 +6762,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
xmlStopParser(ctxt); |
||||||
|
+ ctxt->errNo = XML_ERR_CONDSEC_INVALID; |
||||||
|
return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
@@ -6824,6 +6825,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
if (RAW != '[') { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); |
||||||
|
xmlStopParser(ctxt); |
||||||
|
+ ctxt->errNo = XML_ERR_CONDSEC_INVALID; |
||||||
|
return; |
||||||
|
} else { |
||||||
|
if (ctxt->input->id != id) { |
||||||
|
@@ -6881,6 +6883,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
||||||
|
} else { |
||||||
|
xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL); |
||||||
|
xmlStopParser(ctxt); |
||||||
|
+ ctxt->errNo = XML_ERR_CONDSEC_INVALID_KEYWORD; |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,493 @@ |
|||||||
|
# for -O3 on ppc64 c.f. 1051068 |
||||||
|
%global _performance_build 1 |
||||||
|
|
||||||
|
Summary: Library providing XML and HTML support |
||||||
|
Name: libxml2 |
||||||
|
Version: 2.9.1 |
||||||
|
Release: 6%{?dist}%{?extra_release}.3 |
||||||
|
License: MIT |
||||||
|
Group: Development/Libraries |
||||||
|
Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz |
||||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-root |
||||||
|
BuildRequires: python python-devel zlib-devel pkgconfig xz-devel |
||||||
|
URL: http://xmlsoft.org/ |
||||||
|
Patch0: libxml2-multilib.patch |
||||||
|
Patch1: libxml2-2.9.0-do-not-check-crc.patch |
||||||
|
|
||||||
|
Patch100: libxml2-Fix-a-regression-in-xmlGetDocCompressMode.patch |
||||||
|
Patch101: CVE-2014-3660-rhel7.patch |
||||||
|
Patch102: libxml2-Fix-missing-entities-after-CVE-2014-3660-fix.patch |
||||||
|
Patch103: libxml2-Do-not-fetch-external-parameter-entities.patch |
||||||
|
Patch104: libxml2-Fix-regression-introduced-by-CVE-2014-0191.patch |
||||||
|
Patch105: libxml2-Stop-parsing-on-entities-boundaries-errors.patch |
||||||
|
Patch106: libxml2-Cleanup-conditional-section-error-handling.patch |
||||||
|
Patch107: libxml2-Fail-parsing-early-on-if-encoding-conversion-failed.patch |
||||||
|
Patch108: libxml2-Another-variation-of-overflow-in-Conditional-sections.patch |
||||||
|
Patch109: libxml2-Fix-an-error-in-previous-Conditional-section-patch.patch |
||||||
|
Patch110: libxml2-Fix-parsing-short-unclosed-comment-uninitialized-access.patch |
||||||
|
Patch111: libxml2-Avoid-extra-processing-of-MarkupDecl-when-EOF.patch |
||||||
|
Patch112: libxml2-Avoid-processing-entities-after-encoding-conversion-failures.patch |
||||||
|
Patch113: libxml2-xmlStopParser-reset-errNo.patch |
||||||
|
Patch114: libxml2-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDictComputeFastQKey.patch |
||||||
|
Patch115: libxml2-CVE-2015-5312-Another-entity-expansion-issue.patch |
||||||
|
Patch116: libxml2-Add-xmlHaltParser-to-stop-the-parser.patch |
||||||
|
Patch117: libxml2-Reuse-xmlHaltParser-where-it-makes-sense.patch |
||||||
|
Patch118: libxml2-Do-not-print-error-context-when-there-is-none.patch |
||||||
|
Patch119: libxml2-Detect-incoherency-on-GROW.patch |
||||||
|
Patch120: libxml2-Fix-some-loop-issues-embedding-NEXT.patch |
||||||
|
Patch121: libxml2-Bug-on-creating-new-stream-from-entity.patch |
||||||
|
Patch122: libxml2-CVE-2015-7500-Fix-memory-access-error-due-to-incorrect-entities-boundaries.patch |
||||||
|
Patch123: libxml2-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-push-mode.patch |
||||||
|
Patch124: libxml2-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-memory.patch |
||||||
|
patch125: libxml2-Add-missing-increments-of-recursion-depth-counter-to-XML-parser.patch |
||||||
|
patch126: libxml2-Avoid-building-recursive-entities.patch |
||||||
|
patch127: libxml2-Bug-757711-heap-buffer-overflow-in-xmlFAParsePosCharGroup-https-bugzilla.gnome.org-show_bug.cgi-id-757711.patch |
||||||
|
patch128: libxml2-Bug-758588-Heap-based-buffer-overread-in-xmlParserPrintFileContextInternal-https-bugzilla.gnome.org-show_bug.cgi-id-758588.patch |
||||||
|
patch129: libxml2-Bug-758605-Heap-based-buffer-overread-in-xmlDictAddString-https-bugzilla.gnome.org-show_bug.cgi-id-758605.patch |
||||||
|
patch130: libxml2-Bug-759398-Heap-use-after-free-in-xmlDictComputeFastKey-https-bugzilla.gnome.org-show_bug.cgi-id-759398.patch |
||||||
|
patch131: libxml2-Bug-763071-heap-buffer-overflow-in-xmlStrncat-https-bugzilla.gnome.org-show_bug.cgi-id-763071.patch |
||||||
|
patch132: libxml2-Fix-inappropriate-fetch-of-entities-content.patch |
||||||
|
patch133: libxml2-Fix-some-format-string-warnings-with-possible-format-string-vulnerability.patch |
||||||
|
patch134: libxml2-Heap-based-buffer-overread-in-htmlCurrentChar.patch |
||||||
|
patch135: libxml2-Heap-based-buffer-overread-in-xmlNextChar.patch |
||||||
|
patch136: libxml2-Heap-based-buffer-underreads-due-to-xmlParseName.patch |
||||||
|
patch137: libxml2-Heap-use-after-free-in-htmlParsePubidLiteral-and-htmlParseSystemiteral.patch |
||||||
|
patch138: libxml2-Heap-use-after-free-in-xmlSAX2AttributeNs.patch |
||||||
|
patch139: libxml2-More-format-string-warnings-with-possible-format-string-vulnerability.patch |
||||||
|
|
||||||
|
|
||||||
|
%description |
||||||
|
This library allows to manipulate XML files. It includes support |
||||||
|
to read, modify and write XML and HTML files. There is DTDs support |
||||||
|
this includes parsing and validation even with complex DtDs, either |
||||||
|
at parse time or later once the document has been modified. The output |
||||||
|
can be a simple SAX stream or and in-memory DOM like representations. |
||||||
|
In this case one can use the built-in XPath and XPointer implementation |
||||||
|
to select sub nodes or ranges. A flexible Input/Output mechanism is |
||||||
|
available, with existing HTTP and FTP modules and combined to an |
||||||
|
URI library. |
||||||
|
|
||||||
|
%package devel |
||||||
|
Summary: Libraries, includes, etc. to develop XML and HTML applications |
||||||
|
Group: Development/Libraries |
||||||
|
Requires: libxml2 = %{version}-%{release} |
||||||
|
Requires: zlib-devel |
||||||
|
Requires: xz-devel |
||||||
|
Requires: pkgconfig |
||||||
|
|
||||||
|
%description devel |
||||||
|
Libraries, include files, etc you can use to develop XML applications. |
||||||
|
This library allows to manipulate XML files. It includes support |
||||||
|
to read, modify and write XML and HTML files. There is DTDs support |
||||||
|
this includes parsing and validation even with complex DtDs, either |
||||||
|
at parse time or later once the document has been modified. The output |
||||||
|
can be a simple SAX stream or and in-memory DOM like representations. |
||||||
|
In this case one can use the built-in XPath and XPointer implementation |
||||||
|
to select sub nodes or ranges. A flexible Input/Output mechanism is |
||||||
|
available, with existing HTTP and FTP modules and combined to an |
||||||
|
URI library. |
||||||
|
|
||||||
|
%package static |
||||||
|
Summary: Static library for libxml2 |
||||||
|
Group: Development/Libraries |
||||||
|
Requires: libxml2 = %{version}-%{release} |
||||||
|
|
||||||
|
%description static |
||||||
|
Static library for libxml2 provided for specific uses or shaving a few |
||||||
|
microseconds when parsing, do not link to them for generic purpose packages. |
||||||
|
|
||||||
|
%package python |
||||||
|
Summary: Python bindings for the libxml2 library |
||||||
|
Group: Development/Libraries |
||||||
|
Requires: libxml2 = %{version}-%{release} |
||||||
|
|
||||||
|
%description python |
||||||
|
The libxml2-python package contains a module that permits applications |
||||||
|
written in the Python programming language to use the interface |
||||||
|
supplied by the libxml2 library to manipulate XML files. |
||||||
|
|
||||||
|
This library allows to manipulate XML files. It includes support |
||||||
|
to read, modify and write XML and HTML files. There is DTDs support |
||||||
|
this includes parsing and validation even with complex DTDs, either |
||||||
|
at parse time or later once the document has been modified. |
||||||
|
|
||||||
|
%prep |
||||||
|
%setup -q |
||||||
|
%patch0 -p1 |
||||||
|
# workaround for #877567 - Very weird bug gzip decompression bug in "recent" libxml2 versions |
||||||
|
%patch1 -p1 -b .do-not-check-crc |
||||||
|
|
||||||
|
%patch100 -p1 |
||||||
|
%patch101 -p1 |
||||||
|
%patch102 -p1 |
||||||
|
%patch103 -p1 |
||||||
|
%patch104 -p1 |
||||||
|
%patch105 -p1 |
||||||
|
%patch106 -p1 |
||||||
|
%patch107 -p1 |
||||||
|
%patch108 -p1 |
||||||
|
%patch109 -p1 |
||||||
|
%patch110 -p1 |
||||||
|
%patch111 -p1 |
||||||
|
%patch112 -p1 |
||||||
|
%patch113 -p1 |
||||||
|
%patch114 -p1 |
||||||
|
%patch115 -p1 |
||||||
|
%patch116 -p1 |
||||||
|
%patch117 -p1 |
||||||
|
%patch118 -p1 |
||||||
|
%patch119 -p1 |
||||||
|
%patch120 -p1 |
||||||
|
%patch121 -p1 |
||||||
|
%patch122 -p1 |
||||||
|
%patch123 -p1 |
||||||
|
%patch124 -p1 |
||||||
|
%patch125 -p1 |
||||||
|
%patch126 -p1 |
||||||
|
%patch127 -p1 |
||||||
|
%patch128 -p1 |
||||||
|
%patch129 -p1 |
||||||
|
%patch130 -p1 |
||||||
|
%patch131 -p1 |
||||||
|
%patch132 -p1 |
||||||
|
%patch133 -p1 |
||||||
|
%patch134 -p1 |
||||||
|
%patch135 -p1 |
||||||
|
%patch136 -p1 |
||||||
|
%patch137 -p1 |
||||||
|
%patch138 -p1 |
||||||
|
%patch139 -p1 |
||||||
|
|
||||||
|
%build |
||||||
|
%configure |
||||||
|
make %{_smp_mflags} |
||||||
|
|
||||||
|
%install |
||||||
|
rm -fr %{buildroot} |
||||||
|
|
||||||
|
make install DESTDIR=%{buildroot} |
||||||
|
|
||||||
|
# multiarch crazyness on timestamp differences or Makefile/binaries for examples |
||||||
|
touch -m --reference=$RPM_BUILD_ROOT/%{_includedir}/libxml2/libxml/parser.h $RPM_BUILD_ROOT/%{_bindir}/xml2-config |
||||||
|
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la |
||||||
|
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a |
||||||
|
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la |
||||||
|
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-%{version}/* |
||||||
|
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-python-%{version}/* |
||||||
|
(cd doc/examples ; make clean ; rm -rf .deps Makefile) |
||||||
|
gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz |
||||||
|
|
||||||
|
%check |
||||||
|
make runtests |
||||||
|
|
||||||
|
%clean |
||||||
|
rm -fr %{buildroot} |
||||||
|
|
||||||
|
%post -p /sbin/ldconfig |
||||||
|
|
||||||
|
%postun -p /sbin/ldconfig |
||||||
|
|
||||||
|
%files |
||||||
|
%defattr(-, root, root) |
||||||
|
|
||||||
|
%doc AUTHORS NEWS README Copyright TODO |
||||||
|
%doc %{_mandir}/man1/xmllint.1* |
||||||
|
%doc %{_mandir}/man1/xmlcatalog.1* |
||||||
|
%doc %{_mandir}/man3/libxml.3* |
||||||
|
|
||||||
|
%{_libdir}/lib*.so.* |
||||||
|
%{_bindir}/xmllint |
||||||
|
%{_bindir}/xmlcatalog |
||||||
|
|
||||||
|
%files devel |
||||||
|
%defattr(-, root, root) |
||||||
|
|
||||||
|
%doc %{_mandir}/man1/xml2-config.1* |
||||||
|
%doc AUTHORS NEWS README Copyright |
||||||
|
%doc doc/*.html doc/html doc/*.gif doc/*.png |
||||||
|
%doc doc/tutorial doc/libxml2-api.xml.gz |
||||||
|
%doc doc/examples |
||||||
|
%doc %dir %{_datadir}/gtk-doc/html/libxml2 |
||||||
|
%doc %{_datadir}/gtk-doc/html/libxml2/*.devhelp |
||||||
|
%doc %{_datadir}/gtk-doc/html/libxml2/*.html |
||||||
|
%doc %{_datadir}/gtk-doc/html/libxml2/*.png |
||||||
|
%doc %{_datadir}/gtk-doc/html/libxml2/*.css |
||||||
|
|
||||||
|
%{_libdir}/lib*.so |
||||||
|
%{_libdir}/*.sh |
||||||
|
%{_includedir}/* |
||||||
|
%{_bindir}/xml2-config |
||||||
|
%{_datadir}/aclocal/libxml.m4 |
||||||
|
%{_libdir}/pkgconfig/libxml-2.0.pc |
||||||
|
|
||||||
|
%files static |
||||||
|
%defattr(-, root, root) |
||||||
|
|
||||||
|
%{_libdir}/*a |
||||||
|
|
||||||
|
%files python |
||||||
|
%defattr(-, root, root) |
||||||
|
|
||||||
|
%{_libdir}/python*/site-packages/libxml2.py* |
||||||
|
%{_libdir}/python*/site-packages/drv_libxml2.py* |
||||||
|
%{_libdir}/python*/site-packages/libxml2mod* |
||||||
|
%doc python/TODO |
||||||
|
%doc python/libxml2class.txt |
||||||
|
%doc python/tests/*.py |
||||||
|
%doc doc/*.py |
||||||
|
%doc doc/python.html |
||||||
|
|
||||||
|
%changelog |
||||||
|
* Mon Jun 6 2016 Daniel Veillard <veillard@redhat.com> - libxml2-2.9.1-6.3 |
||||||
|
- Heap-based buffer overread in xmlNextChar (CVE-2016-1762) |
||||||
|
- Bug 763071: Heap-buffer-overflow in xmlStrncat <https://bugzilla.gnome.org/show_bug.cgi?id=763071> (CVE-2016-1834) |
||||||
|
- Bug 757711: Heap-buffer-overflow in xmlFAParsePosCharGroup <https://bugzilla.gnome.org/show_bug.cgi?id=757711> (CVE-2016-1840) |
||||||
|
- Bug 758588: Heap-based buffer overread in xmlParserPrintFileContextInternal <https://bugzilla.gnome.org/show_bug.cgi?id=758588> (CVE-2016-1838) |
||||||
|
- Bug 758605: Heap-based buffer overread in xmlDictAddString <https://bugzilla.gnome.org/show_bug.cgi?id=758605> (CVE-2016-1839) |
||||||
|
- Bug 759398: Heap use-after-free in xmlDictComputeFastKey <https://bugzilla.gnome.org/show_bug.cgi?id=759398> (CVE-2016-1836) |
||||||
|
- Fix inappropriate fetch of entities content (CVE-2016-4449) |
||||||
|
- Heap use-after-free in htmlParsePubidLiteral and htmlParseSystemiteral (CVE-2016-1837) |
||||||
|
- Heap use-after-free in xmlSAX2AttributeNs (CVE-2016-1835) |
||||||
|
- Heap-based buffer-underreads due to xmlParseName (CVE-2016-4447) |
||||||
|
- Heap-based buffer overread in htmlCurrentChar (CVE-2016-1833) |
||||||
|
- Add missing increments of recursion depth counter to XML parser. (CVE-2016-3705) |
||||||
|
- Avoid building recursive entities (CVE-2016-3627) |
||||||
|
- Fix some format string warnings with possible format string vulnerability (CVE-2016-4448) |
||||||
|
- More format string warnings with possible format string vulnerability (CVE-2016-4448) |
||||||
|
|
||||||
|
* Mon Nov 30 2015 Daniel Veillard <veillard@redhat.com> - 2.9.1-6.2 |
||||||
|
- Fix a series of CVEs (rhbz#1286496) |
||||||
|
- CVE-2015-7941 Stop parsing on entities boundaries errors |
||||||
|
- CVE-2015-7941 Cleanup conditional section error handling |
||||||
|
- CVE-2015-8317 Fail parsing early on if encoding conversion failed |
||||||
|
- CVE-2015-7942 Another variation of overflow in Conditional sections |
||||||
|
- CVE-2015-7942 Fix an error in previous Conditional section patch |
||||||
|
- Fix parsing short unclosed comment uninitialized access |
||||||
|
- CVE-2015-7498 Avoid processing entities after encoding conversion failures |
||||||
|
- CVE-2015-7497 Avoid an heap buffer overflow in xmlDictComputeFastQKey |
||||||
|
- CVE-2015-5312 Another entity expansion issue |
||||||
|
- CVE-2015-7499 Add xmlHaltParser() to stop the parser |
||||||
|
- CVE-2015-7499 Detect incoherency on GROW |
||||||
|
- CVE-2015-7500 Fix memory access error due to incorrect entities boundaries |
||||||
|
- CVE-2015-8242 Buffer overead with HTML parser in push mode |
||||||
|
- CVE-2015-1819 Enforce the reader to run in constant memory |
||||||
|
|
||||||
|
* Mon Mar 23 2015 Daniel Veillard <veillard@redhat.com> - 2.9.1-6 |
||||||
|
- Fix missing entities after CVE-2014-3660 fix |
||||||
|
- CVE-2014-0191 Do not fetch external parameter entities (rhbz#1195650) |
||||||
|
- Fix regressions introduced by CVE-2014-0191 patch |
||||||
|
|
||||||
|
* Sat Oct 11 2014 Daniel Veillard <veillard@redhat.com> - 2.9.1-5.1 |
||||||
|
- CVE-2014-3660 denial of service via recursive entity expansion (rhbz#1149087) |
||||||
|
|
||||||
|
* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 2.9.1-5 |
||||||
|
- Mass rebuild 2014-01-24 |
||||||
|
|
||||||
|
* Wed Jan 15 2014 Daniel Veillard <veillard@redhat.com> - 2.9.1-4 |
||||||
|
- rebuild to activate -O3 on ppc64 rhbz#1051068 |
||||||
|
|
||||||
|
* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 2.9.1-3 |
||||||
|
- Mass rebuild 2013-12-27 |
||||||
|
|
||||||
|
* Fri Nov 15 2013 Daniel Veillard <veillard@redhat.com> - 2.9.1-2 |
||||||
|
- Fix a regression in xmlGetDocCompressMode() rhbz#963716 |
||||||
|
|
||||||
|
* Fri Apr 19 2013 Daniel Veillard <veillard@redhat.com> - 2.9.1-1 |
||||||
|
- upstream release of 2.9.1 |
||||||
|
- a couple more API entry point |
||||||
|
- compatibility with python3 |
||||||
|
- a lot of bug fixes |
||||||
|
|
||||||
|
* Mon Feb 11 2013 Daniel Veillard <veillard@redhat.com> - 2.9.0-4 |
||||||
|
- fix --nocheck build which I broke in october rhbz#909767 |
||||||
|
|
||||||
|
* Mon Nov 19 2012 Jaroslav Reznik <jreznik@redhat.com> - 2.9.0-3 |
||||||
|
- workaround for crc/len check failure, rhbz#877567 |
||||||
|
|
||||||
|
* Thu Oct 11 2012 Daniel Veillard <veillard@redhat.com> - 2.9.0-2 |
||||||
|
- remaining cleanups from merge bug rhbz#226079 |
||||||
|
- do not put the docs in the main package, only in -devel rhbz#864731 |
||||||
|
|
||||||
|
* Tue Sep 11 2012 Daniel Veillard <veillard@redhat.com> - 2.9.0-1 |
||||||
|
- upstream release of 2.9.0 |
||||||
|
- A few new API entry points |
||||||
|
- More resilient push parser mode |
||||||
|
- A lot of portability improvement |
||||||
|
- Faster XPath evaluation |
||||||
|
- a lot of bug fixes and smaller improvement |
||||||
|
|
||||||
|
* Fri Aug 10 2012 Daniel Veillard <veillard@redhat.com> - 2.9.0-0rc1 |
||||||
|
- upstream release candidate 1 of 2.9.0 |
||||||
|
- introduce a small API change, but ABI compatible, see |
||||||
|
https://mail.gnome.org/archives/xml/2012-August/msg00005.html |
||||||
|
patches for php, gcc/libjava and evolution-data-connector are upstream |
||||||
|
Grab me in cases of problems veillard@redhat.com |
||||||
|
- many bug fixes including security aspects and small improvements |
||||||
|
|
||||||
|
* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.8.0-2 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild |
||||||
|
|
||||||
|
* Wed May 23 2012 Daniel Veillard <veillard@redhat.com> - 2.8.0-1 |
||||||
|
- upstream release of 2.8.0 |
||||||
|
- add lzma compression support |
||||||
|
- many bug fixes and small improvements |
||||||
|
|
||||||
|
* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.7.8-7 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild |
||||||
|
|
||||||
|
* Fri Mar 4 2011 Daniel Veillard <veillard@redhat.com> - 2.7.8-6 |
||||||
|
- fix a double free in XPath CVE-2010-4494 bug 665965 |
||||||
|
|
||||||
|
* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.7.8-5 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild |
||||||
|
|
||||||
|
* Fri Nov 5 2010 Daniel Veillard <veillard@redhat.com> - 2.7.8-4 |
||||||
|
- reactivate shared libs versionning script |
||||||
|
|
||||||
|
* Thu Nov 4 2010 Daniel Veillard <veillard@redhat.com> - 2.7.8-1 |
||||||
|
- Upstream release of 2.7.8 |
||||||
|
- various bug fixes, including potential crashes |
||||||
|
- new non-destructive formatting option |
||||||
|
- date parsing updated to RFC 5646 |
||||||
|
|
||||||
|
* Wed Jul 21 2010 David Malcolm <dmalcolm@redhat.com> - 2.7.7-2 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild |
||||||
|
|
||||||
|
* Mon Mar 15 2010 Daniel Veillard <veillard@redhat.com> - 2.7.7-1 |
||||||
|
- Upstream release of 2.7.7 |
||||||
|
- fix serious trouble with zlib >= 1.2.4 |
||||||
|
- xmllint new option --xpath |
||||||
|
- various HTML parser improvements |
||||||
|
- includes a number of nug fixes |
||||||
|
|
||||||
|
* Tue Oct 6 2009 Daniel Veillard <veillard@redhat.com> - 2.7.6-1 |
||||||
|
- Upstream release of 2.7.6 |
||||||
|
- restore thread support off by default in 2.7.5 |
||||||
|
|
||||||
|
* Thu Sep 24 2009 Daniel Veillard <veillard@redhat.com> - 2.7.5-1 |
||||||
|
- Upstream release of 2.7.5 |
||||||
|
- fix a couple of Relax-NG validation problems |
||||||
|
- couple more fixes |
||||||
|
|
||||||
|
* Tue Sep 15 2009 Daniel Veillard <veillard@redhat.com> - 2.7.4-2 |
||||||
|
- fix a problem with little data at startup affecting inkscape #523002 |
||||||
|
|
||||||
|
* Thu Sep 10 2009 Daniel Veillard <veillard@redhat.com> - 2.7.4-1 |
||||||
|
- upstream release 2.7.4 |
||||||
|
- symbol versioning of libxml2 shared libs |
||||||
|
- very large number of bug fixes |
||||||
|
|
||||||
|
* Mon Aug 10 2009 Daniel Veillard <veillard@redhat.com> - 2.7.3-4 |
||||||
|
- two patches for parsing problems CVE-2009-2414 and CVE-2009-2416 |
||||||
|
|
||||||
|
* Sat Jul 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.7.3-3 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild |
||||||
|
|
||||||
|
* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.7.3-2 |
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild |
||||||
|
|
||||||
|
* Sun Jan 18 2009 Daniel Veillard <veillard@redhat.com> - 2.7.3-1 |
||||||
|
- new release 2.7.3 |
||||||
|
- limit default max size of text nodes |
||||||
|
- special parser mode for PHP |
||||||
|
- bug fixes and more compiler checks |
||||||
|
|
||||||
|
* Wed Dec 3 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 2.7.2-7 |
||||||
|
- Pull back into Python 2.6 |
||||||
|
|
||||||
|
* Wed Dec 3 2008 Caolán McNamara <caolanm@redhat.com> - 2.7.2-6 |
||||||
|
- AutoProvides requires BuildRequires pkgconfig |
||||||
|
|
||||||
|
* Wed Dec 3 2008 Caolán McNamara <caolanm@redhat.com> - 2.7.2-5 |
||||||
|
- rebuild to get provides(libxml-2.0) into HEAD rawhide |
||||||
|
|
||||||
|
* Mon Dec 1 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 2.7.2-4 |
||||||
|
- Rebuild for pkgconfig logic |
||||||
|
|
||||||
|
* Fri Nov 28 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 2.7.2-3 |
||||||
|
- Rebuild for Python 2.6 |
||||||
|
|
||||||
|
* Wed Nov 12 2008 Daniel Veillard <veillard@redhat.com> - 2.7.2-2.fc11 |
||||||
|
- two patches for size overflows problems CVE-2008-4225 and CVE-2008-4226 |
||||||
|
|
||||||
|
* Fri Oct 3 2008 Daniel Veillard <veillard@redhat.com> 2.7.2-1.fc10 |
||||||
|
- new release 2.7.2 |
||||||
|
- Fixes the known problems in 2.7.1 |
||||||
|
- increase the set of options when saving documents |
||||||
|
|
||||||
|
* Thu Oct 2 2008 Daniel Veillard <veillard@redhat.com> 2.7.1-2.fc10 |
||||||
|
- fix a nasty bug in 2.7.x, http://bugzilla.gnome.org/show_bug.cgi?id=554660 |
||||||
|
|
||||||
|
* Mon Sep 1 2008 Daniel Veillard <veillard@redhat.com> 2.7.1-1.fc10 |
||||||
|
- fix python serialization which was broken in 2.7.0 |
||||||
|
- Resolve: rhbz#460774 |
||||||
|
|
||||||
|
* Sat Aug 30 2008 Daniel Veillard <veillard@redhat.com> 2.7.0-1.fc10 |
||||||
|
- upstream release of 2.7.0 |
||||||
|
- switch to XML 1.0 5th edition |
||||||
|
- switch to RFC 3986 for URI parsing |
||||||
|
- better entity handling |
||||||
|
- option to remove hardcoded limitations in the parser |
||||||
|
- more testing |
||||||
|
- a new API to allocate entity nodes |
||||||
|
- and lot of fixes and clanups |
||||||
|
|
||||||
|
* Mon Aug 25 2008 Daniel Veillard <veillard@redhat.com> 2.6.32-4.fc10 |
||||||
|
- fix for entities recursion problem |
||||||
|
- Resolve: rhbz#459714 |
||||||
|
|
||||||
|
* Fri May 30 2008 Daniel Veillard <veillard@redhat.com> 2.6.32-3.fc10 |
||||||
|
- cleanup based on Fedora packaging guidelines, should fix #226079 |
||||||
|
- separate a -static package |
||||||
|
|
||||||
|
* Thu May 15 2008 Daniel Veillard <veillard@redhat.com> 2.6.32-2.fc10 |
||||||
|
- try to fix multiarch problems like #440206 |
||||||
|
|
||||||
|
* Tue Apr 8 2008 Daniel Veillard <veillard@redhat.com> 2.6.32-1.fc9 |
||||||
|
- upstream release 2.6.32 see http://xmlsoft.org/news.html |
||||||
|
- many bug fixed upstream |
||||||
|
|
||||||
|
* Wed Feb 20 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 2.6.31-2 |
||||||
|
- Autorebuild for GCC 4.3 |
||||||
|
|
||||||
|
* Fri Jan 11 2008 Daniel Veillard <veillard@redhat.com> 2.6.31-1.fc9 |
||||||
|
- upstream release 2.6.31 see http://xmlsoft.org/news.html |
||||||
|
- many bug fixed upstream |
||||||
|
|
||||||
|
* Thu Aug 23 2007 Daniel Veillard <veillard@redhat.com> 2.6.30-1 |
||||||
|
- upstream release 2.6.30 see http://xmlsoft.org/news.html |
||||||
|
- many bug fixed upstream |
||||||
|
|
||||||
|
* Tue Jun 12 2007 Daniel Veillard <veillard@redhat.com> 2.6.29-1 |
||||||
|
- upstream release 2.6.29 see http://xmlsoft.org/news.html |
||||||
|
- many bug fixed upstream |
||||||
|
|
||||||
|
* Wed May 16 2007 Matthias Clasen <mclasen@redhat.com> 2.6.28-2 |
||||||
|
- Bump revision to fix N-V-R problem |
||||||
|
|
||||||
|
* Tue Apr 17 2007 Daniel Veillard <veillard@redhat.com> 2.6.28-1 |
||||||
|
- upstream release 2.6.28 see http://xmlsoft.org/news.html |
||||||
|
- many bug fixed upstream |
||||||
|
|
||||||
|
* Thu Dec 7 2006 Jeremy Katz <katzj@redhat.com> - 2.6.27-2 |
||||||
|
- rebuild against python 2.5 |
||||||
|
|
||||||
|
* Wed Oct 25 2006 Daniel Veillard <veillard@redhat.com> 2.6.27-1 |
||||||
|
- upstream release 2.6.27 see http://xmlsoft.org/news.html |
||||||
|
- very large amount of bug fixes reported upstream |
||||||
|
|
||||||
|
* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 2.6.26-2.1.1 |
||||||
|
- rebuild |
||||||
|
|
||||||
|
* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 2.6.26-2.1 |
||||||
|
- rebuild |
||||||
|
|
||||||
|
* Wed Jun 7 2006 Daniel Veillard <veillard@redhat.com> 2.6.26-2 |
||||||
|
- fix bug #192873 |
||||||
|
* Tue Jun 6 2006 Daniel Veillard <veillard@redhat.com> 2.6.26-1 |
||||||
|
- upstream release 2.6.26 see http://xmlsoft.org/news.html |
||||||
|
|
||||||
|
* Tue Jun 6 2006 Daniel Veillard <veillard@redhat.com> |
||||||
|
- upstream release 2.6.25 broken, do not ship ! |
||||||
|
|
Loading…
Reference in new issue