public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org, Paul Eggert <eggert@cs.ucla.edu>
Subject: [PATCH v3 7/7] misc: Use gmtime instead of localtime
Date: Fri, 18 Mar 2022 13:52:14 -0300	[thread overview]
Message-ID: <20220318165214.2291065-8-adhemerval.zanella@linaro.org> (raw)
In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org>

We deviate from RFC3164 which states timestamp should be in localtime
because although our __localtime_r does not set tzname, the relay still
might still use localtime (which does) and if the server timezone changes
it might result in wrong timestamp from client.  It still does not help
if a process switches its TZ setting from a timezone that has leap
seconds, to one that doesn't (or vice versa), but this would incur in
other problems.

It also handles the highly unlikely case where gmtime 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).

Finally it also uses internally the 64 bit time_t interfaces (to avoid
y2038 issues on 32 bit legacy architectures).

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 misc/syslog.c | 39 ++++++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/misc/syslog.c b/misc/syslog.c
index 7852441615..997e423228 100644
--- a/misc/syslog.c
+++ b/misc/syslog.c
@@ -161,11 +161,25 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
 
   /* "%h %e %H:%M:%S "  */
   char timestamp[timestamp_size];
-  time_t now = time_now ();
+  __time64_t now = time64_now ();
+
+  /* We deviate from RFC3164 which states timestamp should be in localtime
+     because although our __localtime_r does not set tzname, the relay still
+     might still use localtime (which does) and if the server timezone changes
+     it might result in wrong timestamp from client.  It still does not help
+     if a process switches its TZ setting from a timezone that has leap
+     seconds, to one that doesn't (or vice versa), but this would incur in
+     other problems.  */
   struct tm now_tm;
-  __localtime_r (&now, &now_tm);
-  __strftime_l (timestamp, sizeof timestamp, "%h %e %T ", &now_tm,
-                _nl_C_locobj_ptr);
+  bool has_ts = __gmtime64_r (&now, &now_tm) != NULL;
+
+  /* In the highly unlike case of gmtime_r failure (the clock being
+     INT_MIN + 1900 or follow INT_MAX + 1900) we skip the hostname so the
+     message is handl 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_tm,
+		  _nl_C_locobj_ptr);
 
 #define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \
   "<%d>%s %n%s%s%.0d%s: ",                               \
@@ -173,10 +187,18 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
   LogTag == NULL ? __progname : LogTag,                  \
   pid != 0 ? "[" : "", pid, pid != 0 ? "]" : ""
 
+#define SYSLOG_HEADER_WITHOUT_TS(__pri, __msgoff)        \
+  "<%d>: %n", __pri, __msgoff
+
   /* Try to use a static buffer as an optimization.  */
   char bufs[bufs_size];
-  int l = __snprintf (bufs, sizeof bufs,
-                      SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+  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 (l < sizeof (bufs))
     {
       va_list apc;
@@ -204,7 +226,10 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
       if (f != NULL)
         {
           __fsetlocking (f, FSETLOCKING_BYCALLER);
-          fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+	  if (has_ts)
+	    fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
+	  else
+	    fprintf (f, SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
           /* Restore errno for %m format.  */
           __set_errno (saved_errno);
           __vfprintf_internal (f, fmt, ap, mode_flags);
-- 
2.32.0


  parent reply	other threads:[~2022-03-18 16:52 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-18 16:52 [PATCH v3 0/7] Refactor syslog implementation Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 1/7] support: Add xmkfifo Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 2/7] misc: Add syslog test Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 3/7] misc: syslog: Fix indentation and style Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 4/7] misc: syslog: Simplify implementation Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 5/7] misc: syslog: Use fixed-sized buffer Adhemerval Zanella
2022-03-18 16:52 ` [PATCH v3 6/7] misc: syslog: Move SYSLOG_NAME to USE_MISC (BZ #16355) Adhemerval Zanella
2022-03-18 16:52 ` Adhemerval Zanella [this message]
2022-03-21 11:25   ` [PATCH v3 7/7] misc: Use gmtime instead of localtime Andreas Schwab
2022-03-18 21:11 ` [PATCH v3 0/7] Refactor syslog implementation Paul Eggert
2022-03-21 14:10   ` Adhemerval Zanella

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220318165214.2291065-8-adhemerval.zanella@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=eggert@cs.ucla.edu \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).