Blame SOURCES/libxml2-CVE-2015-7500-Fix-memory-access-error-due-to-incorrect-entities-boundaries.patch

6dedca
From d9825f106532a898bb6df46effa0bf099ec16a47 Mon Sep 17 00:00:00 2001
6dedca
From: Daniel Veillard <veillard@redhat.com>
6dedca
Date: Fri, 20 Nov 2015 16:06:59 +0800
6dedca
Subject: [PATCH] CVE-2015-7500 Fix memory access error due to incorrect
6dedca
 entities boundaries
6dedca
To: libvir-list@redhat.com
6dedca
6dedca
For https://bugzilla.gnome.org/show_bug.cgi?id=756525
6dedca
handle properly the case where we popped out of the current entity
6dedca
while processing a start tag
6dedca
Reported by Kostya Serebryany @ Google
6dedca
6dedca
Signed-off-by: Daniel Veillard <veillard@redhat.com>
6dedca
---
6dedca
 parser.c | 28 ++++++++++++++++++++++------
6dedca
 1 file changed, 22 insertions(+), 6 deletions(-)
6dedca
6dedca
diff --git a/parser.c b/parser.c
6dedca
index cc45e17..f4fc310 100644
6dedca
--- a/parser.c
6dedca
+++ b/parser.c
6dedca
@@ -9309,7 +9309,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
6dedca
     const xmlChar **atts = ctxt->atts;
6dedca
     int maxatts = ctxt->maxatts;
6dedca
     int nratts, nbatts, nbdef;
6dedca
-    int i, j, nbNs, attval, oldline, oldcol;
6dedca
+    int i, j, nbNs, attval, oldline, oldcol, inputNr;
6dedca
     const xmlChar *base;
6dedca
     unsigned long cur;
6dedca
     int nsNr = ctxt->nsNr;
6dedca
@@ -9328,6 +9328,7 @@ reparse:
6dedca
     SHRINK;
6dedca
     base = ctxt->input->base;
6dedca
     cur = ctxt->input->cur - ctxt->input->base;
6dedca
+    inputNr = ctxt->inputNr;
6dedca
     oldline = ctxt->input->line;
6dedca
     oldcol = ctxt->input->col;
6dedca
     nbatts = 0;
6dedca
@@ -9353,7 +9354,8 @@ reparse:
6dedca
      */
6dedca
     SKIP_BLANKS;
6dedca
     GROW;
6dedca
-    if (ctxt->input->base != base) goto base_changed;
6dedca
+    if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
6dedca
+        goto base_changed;
6dedca
 
6dedca
     while (((RAW != '>') &&
6dedca
 	   ((RAW != '/') || (NXT(1) != '>')) &&
6dedca
@@ -9364,7 +9366,7 @@ reparse:
6dedca
 
6dedca
 	attname = xmlParseAttribute2(ctxt, prefix, localname,
6dedca
 	                             &aprefix, &attvalue, &len, &alloc);
6dedca
-	if (ctxt->input->base != base) {
6dedca
+	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) {
6dedca
 	    if ((attvalue != NULL) && (alloc != 0))
6dedca
 	        xmlFree(attvalue);
6dedca
 	    attvalue = NULL;
6dedca
@@ -9493,7 +9495,8 @@ skip_default_ns:
6dedca
 skip_ns:
6dedca
 		if (alloc != 0) xmlFree(attvalue);
6dedca
 		SKIP_BLANKS;
6dedca
-		if (ctxt->input->base != base) goto base_changed;
6dedca
+		if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
6dedca
+		    goto base_changed;
6dedca
 		continue;
6dedca
 	    }
6dedca
 
6dedca
@@ -9530,7 +9533,8 @@ failed:
6dedca
 	GROW
6dedca
         if (ctxt->instate == XML_PARSER_EOF)
6dedca
             break;
6dedca
-	if (ctxt->input->base != base) goto base_changed;
6dedca
+	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
6dedca
+	    goto base_changed;
6dedca
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
6dedca
 	    break;
6dedca
 	if (!IS_BLANK_CH(RAW)) {
6dedca
@@ -9546,7 +9550,8 @@ failed:
6dedca
 	    break;
6dedca
 	}
6dedca
         GROW;
6dedca
-	if (ctxt->input->base != base) goto base_changed;
6dedca
+	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
6dedca
+	    goto base_changed;
6dedca
     }
6dedca
 
6dedca
     /*
6dedca
@@ -9713,6 +9718,17 @@ base_changed:
6dedca
 	    if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL))
6dedca
 	        xmlFree((xmlChar *) atts[i]);
6dedca
     }
6dedca
+
6dedca
+    /*
6dedca
+     * We can't switch from one entity to another in the middle
6dedca
+     * of a start tag
6dedca
+     */
6dedca
+    if (inputNr != ctxt->inputNr) {
6dedca
+        xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
6dedca
+		    "Start tag doesn't start and stop in the same entity\n");
6dedca
+	return(NULL);
6dedca
+    }
6dedca
+
6dedca
     ctxt->input->cur = ctxt->input->base + cur;
6dedca
     ctxt->input->line = oldline;
6dedca
     ctxt->input->col = oldcol;
6dedca
-- 
6dedca
2.5.0
6dedca