Blame SOURCES/libxml2-2.9.7-CVE-2016-3709.patch

d5f7cf
From c1ba6f54d32b707ca6d91cb3257ce9de82876b6f Mon Sep 17 00:00:00 2001
d5f7cf
From: Nick Wellnhofer <wellnhofer@aevum.de>
d5f7cf
Date: Sat, 15 Aug 2020 18:32:29 +0200
d5f7cf
Subject: [PATCH] Revert "Do not URI escape in server side includes"
d5f7cf
d5f7cf
This reverts commit 960f0e275616cadc29671a218d7fb9b69eb35588.
d5f7cf
d5f7cf
This commit introduced
d5f7cf
d5f7cf
- an infinite loop, found by OSS-Fuzz, which could be easily fixed.
d5f7cf
- an algorithm with quadratic runtime
d5f7cf
- a security issue, see
d5f7cf
  https://bugzilla.gnome.org/show_bug.cgi?id=769760
d5f7cf
d5f7cf
A better approach is to add an option not to escape URLs at all
d5f7cf
which libxml2 should have possibly done in the first place.
d5f7cf
---
d5f7cf
 HTMLtree.c | 49 +++++++++++--------------------------------------
d5f7cf
 1 file changed, 11 insertions(+), 38 deletions(-)
d5f7cf
d5f7cf
diff --git a/HTMLtree.c b/HTMLtree.c
d5f7cf
index 8d236bb3..cdb7f86a 100644
d5f7cf
--- a/HTMLtree.c
d5f7cf
+++ b/HTMLtree.c
d5f7cf
@@ -706,49 +706,22 @@ htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur,
d5f7cf
 		 (!xmlStrcasecmp(cur->name, BAD_CAST "src")) ||
d5f7cf
 		 ((!xmlStrcasecmp(cur->name, BAD_CAST "name")) &&
d5f7cf
 		  (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) {
d5f7cf
+		xmlChar *escaped;
d5f7cf
 		xmlChar *tmp = value;
d5f7cf
-		/* xmlURIEscapeStr() escapes '"' so it can be safely used. */
d5f7cf
-		xmlBufCCat(buf->buffer, "\"");
d5f7cf
 
d5f7cf
 		while (IS_BLANK_CH(*tmp)) tmp++;
d5f7cf
 
d5f7cf
-		/* URI Escape everything, except server side includes. */
d5f7cf
-		for ( ; ; ) {
d5f7cf
-		    xmlChar *escaped;
d5f7cf
-		    xmlChar endChar;
d5f7cf
-		    xmlChar *end = NULL;
d5f7cf
-		    xmlChar *start = (xmlChar *)xmlStrstr(tmp, BAD_CAST "
d5f7cf
-		    if (start != NULL) {
d5f7cf
-			end = (xmlChar *)xmlStrstr(tmp, BAD_CAST "-->");
d5f7cf
-			if (end != NULL) {
d5f7cf
-			    *start = '\0';
d5f7cf
-			}
d5f7cf
-		    }
d5f7cf
-
d5f7cf
-		    /* Escape the whole string, or until start (set to '\0'). */
d5f7cf
-		    escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+");
d5f7cf
-		    if (escaped != NULL) {
d5f7cf
-		        xmlBufCat(buf->buffer, escaped);
d5f7cf
-		        xmlFree(escaped);
d5f7cf
-		    } else {
d5f7cf
-		        xmlBufCat(buf->buffer, tmp);
d5f7cf
-		    }
d5f7cf
-
d5f7cf
-		    if (end == NULL) { /* Everything has been written. */
d5f7cf
-			break;
d5f7cf
-		    }
d5f7cf
-
d5f7cf
-		    /* Do not escape anything within server side includes. */
d5f7cf
-		    *start = '<'; /* Restore the first character of "
d5f7cf
-		    end += 3; /* strlen("-->") */
d5f7cf
-		    endChar = *end;
d5f7cf
-		    *end = '\0';
d5f7cf
-		    xmlBufCat(buf->buffer, start);
d5f7cf
-		    *end = endChar;
d5f7cf
-		    tmp = end;
d5f7cf
+		/*
d5f7cf
+		 * the < and > have already been escaped at the entity level
d5f7cf
+		 * And doing so here breaks server side includes
d5f7cf
+		 */
d5f7cf
+		escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+<>");
d5f7cf
+		if (escaped != NULL) {
d5f7cf
+		    xmlBufWriteQuotedString(buf->buffer, escaped);
d5f7cf
+		    xmlFree(escaped);
d5f7cf
+		} else {
d5f7cf
+		    xmlBufWriteQuotedString(buf->buffer, value);
d5f7cf
 		}
d5f7cf
-
d5f7cf
-		xmlBufCCat(buf->buffer, "\"");
d5f7cf
 	    } else {
d5f7cf
 		xmlBufWriteQuotedString(buf->buffer, value);
d5f7cf
 	    }
d5f7cf
-- 
d5f7cf
GitLab
d5f7cf