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