mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-10 13:41:35 +00:00
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 f753dd62f951cc62e164421d0c6491f39e4c68ad) Conflicts: src/libvirt_private.syms src/node_device/node_device_udev.c src/util/logging.c src/util/logging.h
This commit is contained in:
parent
0b2750c28e
commit
fbe85fa4fd
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user