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@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to