]> sourceware.org Git - glibc.git/commitdiff
misc: Use 64 bit time_t interfaces on syslog
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 18 Mar 2022 13:10:53 +0000 (10:10 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 15 Apr 2022 13:41:54 +0000 (10:41 -0300)
It also handles the highly unlikely case where localtime might return
NULL, in this case only the PRI is set to hopefully instruct the relay
to get eh TIMESTAMP (as defined by the RFC).

Checked on x86_64-linux-gnu and i686-linux-gnu.

misc/syslog.c

index 1b18375c95fb786b38e24a7d0e80fd16a1a91476..554089bfc45244e87c08eb0482e61c35dd0fa3ca 100644 (file)
@@ -153,11 +153,18 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
 
   /* "%b %e %H:%M:%S "  */
   char timestamp[sizeof "MMM DD hh:mm:ss "];
-  time_t now = time_now ();
+  __time64_t now = time64_now ();
   struct tm now_tm;
-  __localtime_r (&now, &now_tm);
-  __strftime_l (timestamp, sizeof timestamp, "%b %e %T ", &now_tm,
-                _nl_C_locobj_ptr);
+  struct tm *now_tmp = __localtime64_r (&now, &now_tm);
+  bool has_ts = now_tmp != NULL;
+
+  /* In the unlikely case of localtime_r failure (tm_year out of int range)
+     skip the hostname so the message is handled as valid PRI but without
+     TIMESTAMP or invalid TIMESTAMP (which should force the relay to add the
+     timestamp itself).  */
+  if (has_ts)
+    __strftime_l (timestamp, sizeof timestamp, "%h %e %T ", now_tmp,
+                 _nl_C_locobj_ptr);
 
 #define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \
   "<%d>%s %n%s%s%.0d%s: ",                               \
@@ -165,8 +172,16 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
   LogTag == NULL ? __progname : LogTag,                  \
   "[" + (pid == 0), pid, "]" + (pid == 0)
 
-  int l = __snprintf (bufs, sizeof bufs,
-                      SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+#define SYSLOG_HEADER_WITHOUT_TS(__pri, __msgoff)        \
+  "<%d>: %n", __pri, __msgoff
+
+  int l;
+  if (has_ts)
+    l = __snprintf (bufs, sizeof bufs,
+                   SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+  else
+    l = __snprintf (bufs, sizeof bufs,
+                   SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
   if (0 <= l && l < sizeof bufs)
     {
       va_list apc;
@@ -194,8 +209,12 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
          /* Tell the cancellation handler to free this buffer.  */
          clarg.buf = buf;
 
-         __snprintf (buf, sizeof buf,
-                     SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+         if (has_ts)
+           __snprintf (bufs, sizeof bufs,
+                       SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+         else
+           __snprintf (bufs, sizeof bufs,
+                       SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
        }
       else
         {
This page took 0.077865 seconds and 5 git commands to generate.