dntpd - Fix va_list handling bug crash master
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 24 Apr 2015 17:22:02 +0000 (10:22 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 24 Apr 2015 17:22:02 +0000 (10:22 -0700)
* Later versions of gcc manipulate va_lists in ways that prevent them from
  being reused, use va_copy() to make a copy in the log code which uses
  the va_list twice.

* Fixes a seg-fault on startup.

usr.sbin/dntpd/log.c

index 5e0291b..bf9f714 100644 (file)
@@ -114,11 +114,13 @@ vlogline(int level, int newline, const char *ctl, va_list va)
     static char line_build[1024];
     static int line_index;
     int priority;
+    va_list vacopy;
 
     /*
      * Output to stderr directly but build the log line for syslog.
      */
     if (level <= debug_level) {
+       va_copy(vacopy, va);
        if (log_stderr) {
            vfprintf(stderr, ctl, va);
            if (newline)
@@ -127,7 +129,7 @@ vlogline(int level, int newline, const char *ctl, va_list va)
        }
        if (debug_opt == 0) {
            vsnprintf(line_build + line_index, sizeof(line_build) - line_index, 
-                   ctl, va);
+                   ctl, vacopy);
            line_index += strlen(line_build + line_index);
            if (line_index && line_build[line_index-1] == '\n') {
                newline = 1;
@@ -151,6 +153,7 @@ vlogline(int level, int newline, const char *ctl, va_list va)
                line_index = 0;
            }
        }
+       va_end(vacopy);
     }
 }