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 83a37d515b847c6c0e259571050149b1b7f00c6a..b4c98572f0659966ff7531a12d1d4545dbecaefd 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.
 
       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
 -----------------
 
 Exim version 4.90
 -----------------
index 755119813494913315de7a968db25acb3d86b9ea..16f58d26b3c5db919175690f85a3c505644f34fe 100644 (file)
@@ -134,22 +134,27 @@ can get here if there is a failure to open the panic log.)
 
 Arguments:
   priority       syslog priority
 
 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
 
 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;
 
 {
 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))
 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);
 
 
 len = Ustrlen(s);
 
@@ -172,7 +177,7 @@ for (pass = 0; pass < 2; pass++)
   {
   int i;
   int tlen;
   {
   int i;
   int tlen;
-  uschar *ss = s;
+  const uschar * ss = s;
   for (i = 1, tlen = len; tlen > 0; i++)
     {
     int plen = tlen;
   for (i = 1, tlen = len; tlen > 0; i++)
     {
     int plen = tlen;