The virXMLPropStringLimit is an equivalent of virXPathStringLimit
which should be preferred if you already have a XML dom node or
if you need to parse more than one property.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virxml.c | 52 +++++++++++++++++++++++++++++++++++++++---------
src/util/virxml.h | 3 +++
3 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6e4c3e83b9..7646998aef 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2939,6 +2939,7 @@ virXMLNodeToString;
virXMLParseHelper;
virXMLPickShellSafeComment;
virXMLPropString;
+virXMLPropStringLimit;
virXMLSaveFile;
virXMLValidateAgainstSchema;
virXMLValidatorFree;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index b42358a08c..2904fc16c9 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 length permitted 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. */
--
2.13.5