Attached patch solves problem with ipc_log_printf, which calls
_logsys_log_printf. Arguments for this function was va_list, so logged
information was va_list address, instead of "what user wants".
Solution is based on adding new function _logsys_log_vprintf, which
takes va_list as argument. Old _logsys_log_printf is implemented by new
_logsys_log_vprintf (no code duplication).
Another problem which patch fixing is, that old logsys_log_printf used
vsprintf to static allocated buffer. This could cause buffer owerflow,
so vsnprintf is used now.
Index: include/corosync/engine/logsys.h
===================================================================
--- include/corosync/engine/logsys.h (revision 1974)
+++ include/corosync/engine/logsys.h (working copy)
@@ -155,6 +155,15 @@
const char *format,
...) __attribute__((format(printf, 6, 7)));
+extern void _logsys_log_vprintf (
+ int subsys,
+ const char *function_name,
+ const char *file_name,
+ int file_line,
+ unsigned int level,
+ const char *format,
+ va_list ap) __attribute__((format(printf,6,0)));
+
extern void _logsys_log_rec (
int subsys,
const char *function_name,
Index: exec/logsys.c
===================================================================
--- exec/logsys.c (revision 1974)
+++ exec/logsys.c (working copy)
@@ -795,18 +795,17 @@
records_written++;
}
-void _logsys_log_printf (
+void _logsys_log_vprintf (
int subsys,
const char *function_name,
const char *file_name,
int file_line,
unsigned int level,
const char *format,
- ...)
+ va_list ap)
{
char logsys_print_buffer[COMBINE_BUFFER_SIZE];
unsigned int len;
- va_list ap;
if (logsys_mode & LOG_MODE_NOSUBSYS) {
subsys = 0;
@@ -814,9 +813,8 @@
if (level > logsys_loggers[subsys].priority) {
return;
}
- va_start (ap, format);
- len = vsprintf (logsys_print_buffer, format, ap);
- va_end (ap);
+ len = vsnprintf (logsys_print_buffer, COMBINE_BUFFER_SIZE, format, ap);
+
if (logsys_print_buffer[len - 1] == '\n') {
logsys_print_buffer[len - 1] = '\0';
len -= 1;
@@ -849,6 +847,22 @@
}
}
+void _logsys_log_printf (
+ int subsys,
+ const char *function_name,
+ const char *file_name,
+ int file_line,
+ unsigned int level,
+ const char *format,
+ ...)
+{
+ va_list ap;
+
+ va_start (ap, format);
+ _logsys_log_vprintf(subsys, function_name, file_name, file_line, level,
format, ap);
+ va_end (ap);
+}
+
/*
* External Configuration and Initialization API
*/
Index: exec/main.c
===================================================================
--- exec/main.c (revision 1974)
+++ exec/main.c (working copy)
@@ -601,7 +601,7 @@
va_start (ap, format);
- _logsys_log_printf (ipc_subsys_id, __FUNCTION__,
+ _logsys_log_vprintf (ipc_subsys_id, __FUNCTION__,
__FILE__, __LINE__, LOG_LEVEL_ERROR, format, ap);
va_end (ap);
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais