Logging: fix syslog logging for syslog_timestamp=no and log_selector +millisec
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 14 Apr 2018 22:31:05 +0000 (23:31 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 14 Apr 2018 22:31:05 +0000 (23:31 +0100)
         also syslog_pid=no and log_selector +pid

doc/doc-txt/ChangeLog
src/src/log.c

index 83a37d5..b4c9857 100644 (file)
@@ -210,6 +210,11 @@ JH/38 DKIM: accept Ed25519 pubkeys in SubjectPublicKeyInfo-wrapped form,
       since the IETF WG has not yet settled on that versus the original
       "bare" representation.
 
+JH/39 Fix syslog logging for syslog_timestamp=no and log_selector +millisec.
+      Previously the millisecond value corrupted the output.
+      Fix also for syslog_pid=no and log_selector +pid, for which the pid
+      corrupted the output.
+
 
 Exim version 4.90
 -----------------
index 7551198..16f58d2 100644 (file)
@@ -134,22 +134,27 @@ can get here if there is a failure to open the panic log.)
 
 Arguments:
   priority       syslog priority
-  s              the string to be written, the string may be modified!
+  s              the string to be written
 
 Returns:         nothing
 */
 
 static void
-write_syslog(int priority, uschar *s)
+write_syslog(int priority, const uschar *s)
 {
 int len, pass;
 int linecount = 0;
 
 if (running_in_test_harness) return;
 
-if (!syslog_timestamp) s += log_timezone ? 26 : 20;
 if (!syslog_pid && LOGGING(pid))
-    memmove(s + pid_position[0], s + pid_position[1], pid_position[1] - pid_position[0]);
+  s = string_sprintf("%.*s%s", (int)pid_position[0], s, s + pid_position[1]);
+if (!syslog_timestamp)
+  {
+  len = log_timezone ? 26 : 20;
+  if (LOGGING(millisec)) len += 4;
+  s += len;
+  }
 
 len = Ustrlen(s);
 
@@ -172,7 +177,7 @@ for (pass = 0; pass < 2; pass++)
   {
   int i;
   int tlen;
-  uschar *ss = s;
+  const uschar * ss = s;
   for (i = 1, tlen = len; tlen > 0; i++)
     {
     int plen = tlen;