diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 16d668bc86..5f6398fc12 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2960,6 +2960,7 @@ virXMLNodeToString; virXMLParseHelper; virXMLPickShellSafeComment; virXMLPropString; +virXMLPropStringLimit; virXMLSaveFile; virXMLValidateAgainstSchema; virXMLValidatorFree; diff --git a/src/util/virxml.c b/src/util/virxml.c index b42358a08c..d7a8f7267b 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -92,6 +92,24 @@ virXPathString(const char *xpath, return ret; } + +static char * +virXMLStringLimitInternal(char *value, + size_t maxlen, + const char *name) +{ + if (value != NULL && strlen(value) >= maxlen) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("'%s' value longer than '%zu' bytes"), + name, maxlen); + VIR_FREE(value); + return NULL; + } + + return value; +} + + /** * virXPathStringLimit: * @xpath: the XPath string to evaluate @@ -111,15 +129,7 @@ virXPathStringLimit(const char *xpath, { char *tmp = virXPathString(xpath, ctxt); - if (tmp != NULL && strlen(tmp) >= maxlen) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("\'%s\' value longer than %zu bytes"), - xpath, maxlen); - VIR_FREE(tmp); - return NULL; - } - - return tmp; + return virXMLStringLimitInternal(tmp, maxlen, xpath); } /** @@ -506,6 +516,30 @@ virXMLPropString(xmlNodePtr node, return (char *)xmlGetProp(node, BAD_CAST name); } + +/** + * virXMLPropStringLimit: + * @node: XML dom node pointer + * @name: Name of the property (attribute) to get + * @maxlen: maximum permitted length of the string + * + * Wrapper for virXMLPropString, which validates the length of the returned + * string. + * + * Returns a new string which must be deallocated by the caller or NULL if + * the evaluation failed. + */ +char * +virXMLPropStringLimit(xmlNodePtr node, + const char *name, + size_t maxlen) +{ + char *tmp = (char *)xmlGetProp(node, BAD_CAST name); + + return virXMLStringLimitInternal(tmp, maxlen, name); +} + + /** * virXPathBoolean: * @xpath: the XPath string to evaluate diff --git a/src/util/virxml.h b/src/util/virxml.h index 2f953a6d44..1ecc6b0a61 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -73,6 +73,9 @@ int virXPathNodeSet(const char *xpath, xmlNodePtr **list); char * virXMLPropString(xmlNodePtr node, const char *name); +char * virXMLPropStringLimit(xmlNodePtr node, + const char *name, + size_t maxlen); long virXMLChildElementCount(xmlNodePtr node); /* Internal function; prefer the macros below. */