We don't use the gnulib vsnprintf replacement, which means that on mingw, vsnprintf doesn't support %sn. But as it turns out, VIR_GET_VAR_STR was a rather inefficient reimplementation of virVasprintf. * src/util/logging.c (VIR_GET_VAR_STR): Drop. (virLogMessage): Inline a simpler version here. * src/util/virterror.c (VIR_GET_VAR_STR, virRaiseErrorFull): Likewise. Reported by Matthias Bolte. --- src/util/logging.c | 45 ++++++--------------------------------------- src/util/virterror.c | 44 +++++--------------------------------------- 2 files changed, 11 insertions(+), 78 deletions(-) diff --git a/src/util/logging.c b/src/util/logging.c index 823e506..c86fcda 100644 --- a/src/util/logging.c +++ b/src/util/logging.c @@ -47,43 +47,6 @@ #define VIR_FROM_THIS VIR_FROM_NONE /* - * Macro used to format the message as a string in virLogMessage - * and borrowed from libxml2 (also used in virRaiseError) - */ -#define VIR_GET_VAR_STR(msg, str) { \ - int size, prev_size = -1; \ - int chars; \ - char *larger; \ - va_list ap; \ - \ - str = (char *) malloc(150); \ - if (str != NULL) { \ - \ - size = 150; \ - \ - while (1) { \ - va_start(ap, msg); \ - chars = vsnprintf(str, size, msg, ap); \ - va_end(ap); \ - if ((chars > -1) && (chars < size)) { \ - if (prev_size == chars) { \ - break; \ - } else { \ - prev_size = chars; \ - } \ - } \ - if (chars > -1) \ - size += chars + 1; \ - else \ - size += 100; \ - if ((larger = (char *) realloc(str, size)) == NULL) { \ - break; \ - } \ - str = larger; \ - }} \ -} - -/* * A logging buffer to keep some history over logs */ @@ -729,6 +692,7 @@ void virLogMessage(const char *category, int priority, const char *funcname, int len, fprio, i, ret; int saved_errno = errno; int emit = 1; + va_list ap; if (!virLogInitialized) virLogStartup(); @@ -753,9 +717,12 @@ void virLogMessage(const char *category, int priority, const char *funcname, /* * serialize the error message, add level and timestamp */ - VIR_GET_VAR_STR(fmt, str); - if (str == NULL) + va_start(ap, fmt); + if (virVasprintf(&str, fmt, ap) < 0) { + va_end(ap); goto cleanup; + } + va_end(ap); gettimeofday(&cur_time, NULL); localtime_r(&cur_time.tv_sec, &time_info); diff --git a/src/util/virterror.c b/src/util/virterror.c index 2d7309a..852ff9a 100644 --- a/src/util/virterror.c +++ b/src/util/virterror.c @@ -28,43 +28,6 @@ virErrorFunc virErrorHandler = NULL; /* global error handler */ void *virUserData = NULL; /* associated data */ virErrorLogPriorityFunc virErrorLogPriorityFilter = NULL; -/* - * Macro used to format the message as a string in virRaiseError - * and borrowed from libxml2. - */ -#define VIR_GET_VAR_STR(msg, str) { \ - int size, prev_size = -1; \ - int chars; \ - char *larger; \ - va_list ap; \ - \ - str = (char *) malloc(150); \ - if (str != NULL) { \ - \ - size = 150; \ - \ - while (1) { \ - va_start(ap, msg); \ - chars = vsnprintf(str, size, msg, ap); \ - va_end(ap); \ - if ((chars > -1) && (chars < size)) { \ - if (prev_size == chars) { \ - break; \ - } else { \ - prev_size = chars; \ - } \ - } \ - if (chars > -1) \ - size += chars + 1; \ - else \ - size += 100; \ - if ((larger = (char *) realloc(str, size)) == NULL) { \ - break; \ - } \ - str = larger; \ - }} \ -} - static virLogPriority virErrorLevelPriority(virErrorLevel level) { switch (level) { case VIR_ERR_NONE: @@ -718,12 +681,15 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED, } /* - * formats the message + * formats the message; drop message on OOM situations */ if (fmt == NULL) { str = strdup(_("No error message provided")); } else { - VIR_GET_VAR_STR(fmt, str); + va_list ap; + va_start(ap, fmt); + virVasprintf(&str, fmt, ap); + va_end(ap); } /* -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list