[libvirt] [libvirt-glib] Do not encode entities in XML attributes

Daniel P. Berrange berrange at redhat.com
Wed Mar 28 18:19:03 UTC 2012


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
> (é -> &#xE9;), 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 :|




More information about the libvir-list mailing list