Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virstring.c | 25 +++++++++++++++++++++++++
src/util/virstring.h | 20 ++++++++++++++++++++
3 files changed, 46 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fdf4548..80d8e7d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1956,6 +1956,7 @@ virAsprintfInternal;
virSkipSpaces;
virSkipSpacesAndBackslash;
virSkipSpacesBackwards;
+virSnprintfInternal;
virStrcpy;
virStrdup;
virStringArrayHasString;
diff --git a/src/util/virstring.c b/src/util/virstring.c
index b14f785..2a657b3 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -483,6 +483,31 @@ virAsprintfInternal(bool report,
return ret;
}
+int
+virSnprintfInternal(int domcode,
+ const char *filename,
+ const char *funcname,
+ size_t linenr,
+ char *strp,
+ size_t strLen,
+ const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, fmt);
+ ret = vsnprintf(strp, strLen, fmt, ap);
+
+ if (ret >= strLen)
+ virReportErrorHelper(domcode, VIR_ERR_INTERNAL_ERROR,
+ filename, funcname, linenr,
+ _("Size of src string '%d' is greater than
available size of dst string '%zu'"),
+ ret, strLen);
+ va_end(ap);
+ return ret;
+
+}
+
/**
* virStrncpy
*
diff --git a/src/util/virstring.h b/src/util/virstring.h
index 267fbd0..c526c12 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -129,6 +129,11 @@ int virVasprintfInternal(bool report, int domcode, const char
*filename,
const char *fmt, va_list list)
ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7) ATTRIBUTE_FMT_PRINTF(7, 0)
ATTRIBUTE_RETURN_CHECK;
+int virSnprintfInternal(int domcode, const char *filename, const char *funcname,
+ size_t linenr, char *strp, size_t strLen,
+ const char *fmt, ...)
+ ATTRIBUTE_NONNULL(5) ATTRIBUTE_FMT_PRINTF(7, 8)
+ ATTRIBUTE_RETURN_CHECK;
/**
* VIR_STRDUP:
@@ -252,6 +257,21 @@ size_t virStringListLength(char **strings);
virAsprintfInternal(false, 0, NULL, NULL, 0, \
strp, __VA_ARGS__)
+/**
+ * virSnprintf:
+ * @strp: variable to hold result (char*)
+ * @fmt: printf format
+ *
+ * Like glibc's_snprintf but report error if the src string is longer
+ * then dst string.
+ *
+ * Returns -1 on failure, number of bytes printed on success.
+ */
+
+# define virSnprintf(strp, ...) \
+ virSnprintfInternal(VIR_FROM_THIS, __FILE__, __FUNCTION__, __LINE__, \
+ strp, ARRAY_CARDINALITY(strp), __VA_ARGS__)
+
int virStringSortCompare(const void *a, const void *b);
int virStringSortRevCompare(const void *a, const void *b);
--
1.8.5.5