[libvirt] [PATCH 04/28] conf: clean up virDomainNetIPParseXML()

Laine Stump laine at laine.org
Wed Jun 22 17:37:03 UTC 2016


Rearrange this function to be better organized and more correct:

* the error codes were changed from the incorrect INVALID_ARG to
  XML_ERROR

* prefix still isn't required, but if present it must be valid or an
  error will be logged.

* don't emit a debug log just because prefix is missing - this
  is valid.

* group everything related to setting prefix in one place rather than
  scattered through the function.
---
 src/conf/domain_conf.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e57655e..c5b4815 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6115,15 +6115,9 @@ virDomainNetIPParseXML(xmlNodePtr node)
     int family = AF_UNSPEC;
     char *address = NULL;
 
-    if (!(prefixStr = virXMLPropString(node, "prefix")) ||
-        (virStrToLong_ui(prefixStr, NULL, 10, &prefixValue) < 0)) {
-        // Don't shout, as some old config may not have a prefix
-        VIR_DEBUG("Missing or invalid network prefix");
-    }
-
     if (!(address = virXMLPropString(node, "address"))) {
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("Missing network address"));
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("Missing required address in <ip>"));
         goto cleanup;
     }
 
@@ -6139,11 +6133,22 @@ virDomainNetIPParseXML(xmlNodePtr node)
         goto cleanup;
 
     if (virSocketAddrParse(&ip->address, address, family) < 0) {
-        virReportError(VIR_ERR_INVALID_ARG,
-                       _("Failed to parse IP address: '%s'"),
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid address '%s' in <ip>"),
                        address);
         goto cleanup;
     }
+
+    prefixStr = virXMLPropString(node, "prefix");
+    if (prefixStr &&
+        ((virStrToLong_ui(prefixStr, NULL, 10, &prefixValue) < 0) ||
+         (family == AF_INET6 && prefixValue > 128) ||
+         (family == AF_INET && prefixValue > 32))) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid prefix value '%s' in <ip>"),
+                       prefixStr);
+        goto cleanup;
+    }
     ip->prefix = prefixValue;
 
     ret = ip;
-- 
2.5.5




More information about the libvir-list mailing list