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

Reply via email to