提交 fbe85fa4 编写于 作者: J Ján Tomko 提交者: Cole Robinson

udev: fix crash in libudev logging

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 f753dd62)

Conflicts:
	src/libvirt_private.syms
	src/node_device/node_device_udev.c
	src/util/logging.c
	src/util/logging.h
上级 0b2750c2
......@@ -809,11 +809,13 @@ virLogMessage;
virLogParseDefaultPriority;
virLogParseFilters;
virLogParseOutputs;
virLogPriorityFromSyslog;
virLogReset;
virLogSetBufferSize;
virLogSetDefaultPriority;
virLogSetFromEnv;
virLogUnlock;
virLogVMessage;
# memory.h
......
......@@ -350,15 +350,36 @@ 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(file, fn, line, fmt, args);
virBuffer buf = VIR_BUFFER_INITIALIZER;
const char *format = NULL;
virBufferAdd(&buf, fmt, -1);
virBufferTrim(&buf, "\n", -1);
format = virBufferContentAndReset(&buf);
virLogVMessage(file, virLogPriorityFromSyslog(priority),
fn, line, 0, format ? format : fmt, args);
VIR_FREE(format);
}
......@@ -1662,7 +1683,8 @@ static int udevDeviceMonitorStartup(int 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) {
......
......@@ -919,6 +919,31 @@ static int virLogAddOutputToSyslog(int priority, const char *ident) {
}
return 0;
}
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) \
......
......@@ -137,6 +137,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(const char *category, int priority,
const char *funcname, long long linenr,
unsigned int flags,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册