[libvirt PATCH 04/10] virDomainAudioDefParseXML: Use virXMLProp*

Tim Wiederhake twiederh at redhat.com
Wed May 19 14:10:06 UTC 2021


This strictens the parser to disallow negative values (interpreted as
`UINT_MAX + value + 1`) for attribute `id`. Allowing negative
numbers to be interpreted this way makes no sense for this attribute.

Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
---
 src/conf/domain_conf.c | 74 ++++++++++++------------------------------
 1 file changed, 21 insertions(+), 53 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9e6719265f..2142e45fd5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13122,40 +13122,18 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
 {
     virDomainAudioDef *def;
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
-    g_autofree char *tmp = NULL;
-    g_autofree char *typestr = NULL;
-    int type;
     xmlNodePtr inputNode, outputNode;
 
     def = g_new0(virDomainAudioDef, 1);
     ctxt->node = node;
 
-    typestr = virXMLPropString(node, "type");
-    if (!typestr) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("missing audio 'type' attribute"));
-        goto error;
-    }
-
-    if ((type = virDomainAudioTypeTypeFromString(typestr)) < 0) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("unknown audio type '%s'"), typestr);
+    if (virXMLPropEnum(node, "type", virDomainAudioTypeTypeFromString,
+                       VIR_XML_PROP_REQUIRED, &def->type) < 0)
         goto error;
-    }
-    def->type = type;
 
-    tmp = virXMLPropString(node, "id");
-    if (!tmp) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("missing audio 'id' attribute"));
-        goto error;
-    }
-    if (virStrToLong_ui(tmp, NULL, 10, &def->id) < 0 ||
-        def->id == 0) {
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("invalid audio 'id' value '%s'"), tmp);
+    if (virXMLPropUInt(node, "id", 10, VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
+                       &def->id) < 0)
         goto error;
-    }
 
     inputNode = virXPathNode("./input", ctxt);
     outputNode = virXPathNode("./output", ctxt);
@@ -13191,29 +13169,25 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
         break;
 
     case VIR_DOMAIN_AUDIO_TYPE_OSS: {
-        g_autofree char *tryMMap = virXMLPropString(node, "tryMMap");
-        g_autofree char *exclusive = virXMLPropString(node, "exclusive");
-        g_autofree char *dspPolicy = virXMLPropString(node, "dspPolicy");
+        int dspPolicySet;
 
-        if (tryMMap && ((def->backend.oss.tryMMap =
-                         virTristateBoolTypeFromString(tryMMap)) <= 0)) {
-            virReportError(VIR_ERR_XML_ERROR,
-                           _("unknown 'tryMMap' value '%s'"), tryMMap);
+        if (virXMLPropTristateBool(node, "tryMMap", VIR_XML_PROP_NONE,
+                                   &def->backend.oss.tryMMap) < 0)
             goto error;
-        }
 
-        if (exclusive && ((def->backend.oss.exclusive =
-                           virTristateBoolTypeFromString(exclusive)) <= 0)) {
-            virReportError(VIR_ERR_XML_ERROR,
-                           _("unknown 'exclusive' value '%s'"), exclusive);
+        if (virXMLPropTristateBool(node, "exclusive", VIR_XML_PROP_NONE,
+                                   &def->backend.oss.exclusive) < 0)
+            goto error;
+
+        if ((dspPolicySet = virXMLPropInt(node, "dspPolicy", 10, VIR_XML_PROP_NONE,
+                                     &def->backend.oss.dspPolicy, 0)) < 0)
             goto error;
-        }
 
-        if (dspPolicy) {
-            if (virStrToLong_i(dspPolicy, NULL, 10,
-                               &def->backend.oss.dspPolicy) < 0) {
+        if (dspPolicySet != 0) {
+            if (def->backend.oss.dspPolicy < 0) {
                 virReportError(VIR_ERR_XML_ERROR,
-                               _("cannot parse 'dspPolicy' value '%s'"), dspPolicy);
+                               _("cannot parse 'dspPolicy' value '%i'"),
+                               def->backend.oss.dspPolicy);
                 goto error;
             }
             def->backend.oss.dspPolicySet = true;
@@ -13236,16 +13210,10 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
         break;
 
     case VIR_DOMAIN_AUDIO_TYPE_SDL: {
-        g_autofree char *driverstr = virXMLPropString(node, "driver");
-        int driver;
-        if (driverstr) {
-            if ((driver = virDomainAudioSDLDriverTypeFromString(driverstr)) <= 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown SDL driver '%s'"), driverstr);
-                goto error;
-            }
-            def->backend.sdl.driver = driver;
-        }
+        if (virXMLPropEnum(node, "driver", virDomainAudioSDLDriverTypeFromString,
+                           VIR_XML_PROP_NONZERO, &def->backend.sdl.driver) < 0)
+            goto error;
+
         if (inputNode)
             virDomainAudioSDLParse(&def->backend.sdl.input, inputNode);
         if (outputNode)
-- 
2.26.3




More information about the libvir-list mailing list