tags 781232 +patch
thanks

Hi Salvatore, Hi Aron,
On Mon, Aug 31, 2015 at 11:02:48AM +0200, Salvatore Bonaccorso wrote:
> Hi Aron,
> 
> Specific for the issue now seen for #781232: Looked shortly at
> https://bugzilla.gnome.org/show_bug.cgi?id=731063#c1 According to that
> comment the original patch lead to more issues (e.g.  the one which we
> see now) and more patches were applied. I have though not tried to
> skim trough to check which are required.

Attached patch resolves the libvirt related regression for me. It's a
straight cherry pick from upstream commit

    beb7281055dbf0ed4d041022a67c6c5cfd126f25

Can we have this in sid please? It would also be great to have this
backported to Jessie since libvirt is there affected as well. (And yes,
I do think the severity is correct).

Cheers,
 -- Guido
>From 8bd5340bdcea5df2c0673221fdf50b52e2c4b42b Mon Sep 17 00:00:00 2001
Message-Id: <8bd5340bdcea5df2c0673221fdf50b52e2c4b42b.1441456272.git....@sigxcpu.org>
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <a...@sigxcpu.org>
Date: Sat, 5 Sep 2015 13:35:34 +0200
Subject: [PATCH] Fix a problem properly saving URIs

Closes: #781232
---
 debian/changelog                                   |   8 ++
 .../Fix-a-problem-properly-saving-URIs.patch       | 125 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 134 insertions(+)
 create mode 100644 debian/patches/Fix-a-problem-properly-saving-URIs.patch

diff --git a/debian/changelog b/debian/changelog
index f7ec7e5..0c54181 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+libxml2 (2.9.2+really2.9.1+dfsg1-0.2~1.gbp02bf46) UNRELEASED; urgency=medium
+
+  ** SNAPSHOT build @02bf46806799417854809144e36379558c906a6b **
+
+  * [02bf468] Fix a problem properly saving URIs (Closes: #781232)
+
+ -- Guido Günther <a...@sigxcpu.org>  Sat, 05 Sep 2015 13:41:54 +0200
+
 libxml2 (2.9.2+really2.9.1+dfsg1-0.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff --git a/debian/patches/Fix-a-problem-properly-saving-URIs.patch b/debian/patches/Fix-a-problem-properly-saving-URIs.patch
new file mode 100644
index 0000000..71c4261
--- /dev/null
+++ b/debian/patches/Fix-a-problem-properly-saving-URIs.patch
@@ -0,0 +1,125 @@
+From: Daniel Veillard <veill...@redhat.com>
+Date: Fri, 3 Oct 2014 19:22:39 +0800
+Subject: Fix a problem properly saving URIs
+
+As written by Martin Kletzander <mklet...@redhat.com>:
+Since commit 8eb55d782a2b9afacc7938694891cc6fad7b42a5, when you parse
+and save an URI that has no server (or similar) part, two slashes
+after the 'schema:' get lost.  It means 'uri:///noserver' is turned
+into 'uri:/noserver'.
+
+basically
+   foo:///only/path
+
+means a host of "" while
+
+   foo:/only/path
+
+means no host at all
+
+  So the best fix IMHO is to fix the URI parser to record the first
+case and an empty host string and the second case as a NULL host string
+
+ I would not revert the initial patch, we should not 'invent' those
+slash, but we should instead when parsing keep the information that
+it's a host based path and that foo:/// means the presence of a host
+but an empty one.
+
+Once applied the resulting patch below, all cases seems to be saved
+properly:
+
+thinkpad:~/XML -> ./testURI uri:/noserver
+uri:/noserver
+thinkpad:~/XML -> ./testURI uri:///noserver
+uri:///noserver
+thinkpad:~/XML -> ./testURI uri://server/foo
+uri://server/foo
+thinkpad:~/XML -> ./testURI uri:/noserver/foo
+uri:/noserver/foo
+thinkpad:~/XML -> ./testURI uri:///
+uri:///
+thinkpad:~/XML -> ./testURI uri://
+uri://
+thinkpad:~/XML -> ./testURI uri:/
+uri:/
+thinkpad:~/XML ->
+
+  If you revert the initial patch that last case fails
+
+The problem is that I don't want to change the xmlURI structure to
+minimize ABI breakage, so I could not extend the field. The natural
+solution is to denote that uri:/// has an empty host by making
+the uri server field an empty string which works very well but breaks
+applications (like libvirt ;-) who blindly look at uri->server
+not being NULL to try to reach it !
+Simplest was to stick the port to -1 in that case, instead of 0
+application don't bother looking at the port of there is no server
+string, this makes the patch more complex than a 1 liner, but
+is better for ABI.
+
+Closes: #781232
+---
+ uri.c | 34 +++++++++++++++++++---------------
+ 1 file changed, 19 insertions(+), 15 deletions(-)
+
+diff --git a/uri.c b/uri.c
+index d4dcd2f..ff47abb 100644
+--- a/uri.c
++++ b/uri.c
+@@ -759,6 +759,8 @@ xmlParse3986HierPart(xmlURIPtr uri, const char **str)
+         cur += 2;
+ 	ret = xmlParse3986Authority(uri, &cur);
+ 	if (ret != 0) return(ret);
++	if (uri->server == NULL)
++	    uri->port = -1;
+ 	ret = xmlParse3986PathAbEmpty(uri, &cur);
+ 	if (ret != 0) return(ret);
+ 	*str = cur;
+@@ -1106,7 +1108,7 @@ xmlSaveUri(xmlURIPtr uri) {
+ 	    }
+ 	}
+     } else {
+-	if (uri->server != NULL) {
++	if ((uri->server != NULL) || (uri->port == -1)) {
+ 	    if (len + 3 >= max) {
+                 temp = xmlSaveUriRealloc(ret, &max);
+                 if (temp == NULL) goto mem_error;
+@@ -1143,22 +1145,24 @@ xmlSaveUri(xmlURIPtr uri) {
+ 		}
+ 		ret[len++] = '@';
+ 	    }
+-	    p = uri->server;
+-	    while (*p != 0) {
+-		if (len >= max) {
+-                    temp = xmlSaveUriRealloc(ret, &max);
+-                    if (temp == NULL) goto mem_error;
+-                    ret = temp;
++	    if (uri->server != NULL) {
++		p = uri->server;
++		while (*p != 0) {
++		    if (len >= max) {
++			temp = xmlSaveUriRealloc(ret, &max);
++			if (temp == NULL) goto mem_error;
++			ret = temp;
++		    }
++		    ret[len++] = *p++;
+ 		}
+-		ret[len++] = *p++;
+-	    }
+-	    if (uri->port > 0) {
+-		if (len + 10 >= max) {
+-                    temp = xmlSaveUriRealloc(ret, &max);
+-                    if (temp == NULL) goto mem_error;
+-                    ret = temp;
++		if (uri->port > 0) {
++		    if (len + 10 >= max) {
++			temp = xmlSaveUriRealloc(ret, &max);
++			if (temp == NULL) goto mem_error;
++			ret = temp;
++		    }
++		    len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
+ 		}
+-		len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
+ 	    }
+ 	} else if (uri->authority != NULL) {
+ 	    if (len + 3 >= max) {
diff --git a/debian/patches/series b/debian/patches/series
index 5d07130..8c70a58 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -57,3 +57,4 @@
 0057-Cleanup-conditional-section-error-handling.patch
 0058-Fix-upstream-bug-299127.patch
 0059-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch
+Fix-a-problem-properly-saving-URIs.patch
-- 
2.1.4

Reply via email to