[libvirt] [PATCH] consolidate virXPathNodeSet()

While reviewing Rich last patch I was afraid that virXPathNodeSet() could return -1 when doing an evaluation failure. It is based on xmlXPathEval() from libxml2 whose behaviour is to possibly return NULL on XPath evaluation failure independantly of the kind of failure: http://xmlsoft.org/html/libxml-xpath.html#xmlXPathEval I suggest to apply this patch to make sure we always return 0 unless the returned XPath type is of the wrong type (meaning the query passed didn't evaluate to a node set and code must be fixed) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On Wed, Oct 21, 2009 at 05:24:03PM +0200, Daniel Veillard wrote:
While reviewing Rich last patch I was afraid that virXPathNodeSet() could return -1 when doing an evaluation failure. It is based on xmlXPathEval() from libxml2 whose behaviour is to possibly return NULL on XPath evaluation failure independantly of the kind of failure:
http://xmlsoft.org/html/libxml-xpath.html#xmlXPathEval
I suggest to apply this patch to make sure we always return 0 unless the returned XPath type is of the wrong type (meaning the query passed didn't evaluate to a node set and code must be fixed)
ACK
diff --git a/src/util/xml.c b/src/util/xml.c index 4118d2a..4fa443d 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -490,11 +490,16 @@ virXPathNodeSet(virConnectPtr conn, relnode = ctxt->node; obj = xmlXPathEval(BAD_CAST xpath, ctxt); ctxt->node = relnode; - if ((obj == NULL) || (obj->type != XPATH_NODESET) || - (obj->nodesetval == NULL) || (obj->nodesetval->nodeNr < 0)) { + if (obj == NULL) + return(0); + if (obj->type != XPATH_NODESET) { xmlXPathFreeObject(obj); return (-1); } + if ((obj->nodesetval == NULL) || (obj->nodesetval->nodeNr < 0)) { + xmlXPathFreeObject(obj); + return (0); + }
ret = obj->nodesetval->nodeNr; if (list != NULL && ret) {
Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On Wed, Oct 21, 2009 at 07:51:45PM +0100, Daniel P. Berrange wrote:
On Wed, Oct 21, 2009 at 05:24:03PM +0200, Daniel Veillard wrote:
While reviewing Rich last patch I was afraid that virXPathNodeSet() could return -1 when doing an evaluation failure. It is based on xmlXPathEval() from libxml2 whose behaviour is to possibly return NULL on XPath evaluation failure independantly of the kind of failure:
http://xmlsoft.org/html/libxml-xpath.html#xmlXPathEval
I suggest to apply this patch to make sure we always return 0 unless the returned XPath type is of the wrong type (meaning the query passed didn't evaluate to a node set and code must be fixed)
ACK
Okay, pushed ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (2)
-
Daniel P. Berrange
-
Daniel Veillard