On Wed, Mar 28, 2012 at 06:32:57PM +0200, Christophe Fergeau wrote:
libxml2 will properly escape < > and " in XML attribute
content. If
we use xmlEncodeEntitiesReentrant for attributes, this causes issues
with UTF8 filenames (gvir_config_domain_disk_set_source for example):
the filename UTF8 characters will be substituted with entities
(é -> é), but when it uses this filename, libvirt will use it as
is and will fail to find the file.
I've tested that with this change gnome-boxes can open ISOs in directories
with 'é' in their names, and in directories with '&foo;xx<' in
their names.
---
libvirt-gconfig/libvirt-gconfig-object.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c
b/libvirt-gconfig/libvirt-gconfig-object.c
index 9a142c9..ee3584a 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -711,7 +711,6 @@ gvir_config_object_set_attribute(GVirConfigObject *object, ...)
while (TRUE) {
const char *name;
const char *value;
- xmlChar *encoded_value;
name = va_arg(args, const char *);
if (name == NULL) {
@@ -723,9 +722,7 @@ gvir_config_object_set_attribute(GVirConfigObject *object, ...)
g_warn_if_reached();
break;
}
- encoded_value = xmlEncodeEntitiesReentrant(doc, (xmlChar*)value);
- xmlNewProp(object->priv->node, (xmlChar *)name, encoded_value);
- xmlFree(encoded_value);
+ xmlNewProp(object->priv->node, (xmlChar *)name, (xmlChar *)value);
}
va_end(args);
}
@@ -780,17 +777,11 @@ gvir_config_object_set_attribute_with_type(GVirConfigObject
*object, ...)
str = g_strdup_printf("%d", val);
break;
}
- case G_TYPE_STRING: {
- xmlDocPtr doc;
- xmlChar *enc_str;
-
+ case G_TYPE_STRING:
str = va_arg(args, char *);
- g_object_get(G_OBJECT(object->priv->doc), "doc",
&doc, NULL);
- enc_str = xmlEncodeEntitiesReentrant(doc, (xmlChar*)str);
- str = g_strdup((char *)enc_str);
- xmlFree(enc_str);
+ xmlNewProp(object->priv->node, (xmlChar *)name, (xmlChar *)str);
+ str = NULL;
break;
- }
case G_TYPE_BOOLEAN: {
gboolean val;
val = va_arg(args, gboolean);
ACK
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|