]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
udev: fix crash in libudev logging
authorJán Tomko <jtomko@redhat.com>
Fri, 7 Jun 2013 09:55:27 +0000 (11:55 +0200)
committerCole Robinson <crobinso@redhat.com>
Thu, 11 Jul 2013 21:29:33 +0000 (17:29 -0400)
Call virLogVMessage instead of virLogMessage, since libudev
called us with a va_list object, not a list of arguments.

Honor message priority and strip the trailing newline.

https://bugzilla.redhat.com/show_bug.cgi?id=969152
(cherry picked from commit f753dd62f951cc62e164421d0c6491f39e4c68ad)

src/libvirt_private.syms
src/node_device/node_device_udev.c
src/util/virlog.c
src/util/virlog.h

index a7e1eeb65dcefd3659526f44c3f880b8617911f8..df5b16590e0918988aa33953833103e01b4a7b3d 100644 (file)
@@ -1439,12 +1439,14 @@ virLogMessage;
 virLogParseDefaultPriority;
 virLogParseFilters;
 virLogParseOutputs;
+virLogPriorityFromSyslog;
 virLogProbablyLogMessage;
 virLogReset;
 virLogSetBufferSize;
 virLogSetDefaultPriority;
 virLogSetFromEnv;
 virLogUnlock;
+virLogVMessage;
 
 
 # util/virmacaddr.h
index f98841e96f1b6991d22e6ccaee061a3d52c458e1..1dc74f33cde6acdbee67eb02fc52d563eac94ad9 100644 (file)
@@ -351,15 +351,37 @@ static int udevGenerateDeviceName(struct udev_device *device,
 }
 
 
-static void udevLogFunction(struct udev *udev ATTRIBUTE_UNUSED,
-                            int priority ATTRIBUTE_UNUSED,
-                            const char *file,
-                            int line,
-                            const char *fn,
-                            const char *fmt,
-                            va_list args)
+typedef void (*udevLogFunctionPtr)(struct udev *udev,
+                                   int priority,
+                                   const char *file,
+                                   int line,
+                                   const char *fn,
+                                   const char *format,
+                                   va_list args);
+
+static void
+ATTRIBUTE_FMT_PRINTF(6,0)
+udevLogFunction(struct udev *udev ATTRIBUTE_UNUSED,
+                int priority,
+                const char *file,
+                int line,
+                const char *fn,
+                const char *fmt,
+                va_list args)
 {
-    VIR_ERROR_INT(VIR_LOG_FROM_LIBRARY, file, line, fn, fmt, args);
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    const char *format = NULL;
+
+    virBufferAdd(&buf, fmt, -1);
+    virBufferTrim(&buf, "\n", -1);
+
+    format = virBufferContentAndReset(&buf);
+
+    virLogVMessage(VIR_LOG_FROM_LIBRARY,
+                   virLogPriorityFromSyslog(priority),
+                   file, line, fn, NULL, format ? format : fmt, args);
+
+    VIR_FREE(format);
 }
 
 
@@ -1710,7 +1732,8 @@ static int nodeDeviceStateInitialize(bool privileged ATTRIBUTE_UNUSED,
      * its return value.
      */
     udev = udev_new();
-    udev_set_log_fn(udev, udevLogFunction);
+    /* cast to get rid of missing-format-attribute warning */
+    udev_set_log_fn(udev, (udevLogFunctionPtr) udevLogFunction);
 
     priv->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
     if (priv->udev_monitor == NULL) {
index 078559580b7e2476e764fb5ddfe8642b7f63f6f2..c8e2879f56973439bed22802d8102aadf70404e3 100644 (file)
@@ -1261,6 +1261,31 @@ static int virLogAddOutputToJournald(int priority)
     return 0;
 }
 # endif /* USE_JOURNALD */
+
+int virLogPriorityFromSyslog(int priority)
+{
+    switch (priority) {
+    case LOG_EMERG:
+    case LOG_ALERT:
+    case LOG_CRIT:
+    case LOG_ERR:
+        return VIR_LOG_ERROR;
+    case LOG_WARNING:
+    case LOG_NOTICE:
+        return VIR_LOG_WARN;
+    case LOG_INFO:
+        return VIR_LOG_INFO;
+    case LOG_DEBUG:
+        return VIR_LOG_DEBUG;
+    }
+    return VIR_LOG_ERROR;
+}
+
+#else /* HAVE_SYSLOG_H */
+int virLogPriorityFromSyslog(int priority ATTRIBUTE_UNUSED)
+{
+    return VIR_LOG_ERROR;
+}
 #endif /* HAVE_SYSLOG_H */
 
 #define IS_SPACE(cur)                                                   \
index 6b83245eced8f3b34cc5c18478eb72c9f557f5fc..7db165715764479975b4bf01268e182ee524572a 100644 (file)
@@ -171,6 +171,7 @@ extern int virLogReset(void);
 extern int virLogParseDefaultPriority(const char *priority);
 extern int virLogParseFilters(const char *filters);
 extern int virLogParseOutputs(const char *output);
+extern int virLogPriorityFromSyslog(int priority);
 extern void virLogMessage(virLogSource src,
                           virLogPriority priority,
                           const char *filename,