[glib/dont-memoize-in-g_log_writer_is_journald] gmessages: don't memoize in g_log_writer_is_journald()



commit f1175704b6c48672e480a7006f05944ad6a1e2f8
Author: Will Thompson <will willthompson co uk>
Date:   Mon Nov 12 11:20:49 2018 +0000

    gmessages: don't memoize in g_log_writer_is_journald()
    
    Previously, g_log_writer_is_journald() would cache the result for the
    first (non-negative) FD it was called on, and return that result for
    all future (non-negative) FDs. While unlikely, it's possible that
    applications might call this function on something other than
    fileno(stderr).
    
    Move the memoization into g_log_writer_default(), which always passes
    fileno(stderr).
    
    Fixes #1589.

 glib/gmessages.c | 42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)
---
diff --git a/glib/gmessages.c b/glib/gmessages.c
index 569fe2cf8..a43ff0e58 100644
--- a/glib/gmessages.c
+++ b/glib/gmessages.c
@@ -2165,31 +2165,24 @@ g_log_writer_is_journald (gint output_fd)
   /* FIXME: Use the new journal API for detecting whether we’re writing to the
    * journal. See: https://github.com/systemd/systemd/issues/2473
    */
-  static gsize initialized;
-  static gboolean fd_is_journal = FALSE;
+  union {
+    struct sockaddr_storage storage;
+    struct sockaddr sa;
+    struct sockaddr_un un;
+  } addr;
+  socklen_t addr_len;
+  int err;
 
   if (output_fd < 0)
     return FALSE;
 
-  if (g_once_init_enter (&initialized))
-    {
-      union {
-        struct sockaddr_storage storage;
-        struct sockaddr sa;
-        struct sockaddr_un un;
-      } addr;
-      socklen_t addr_len = sizeof(addr);
-      int err = getpeername (output_fd, &addr.sa, &addr_len);
-      if (err == 0 && addr.storage.ss_family == AF_UNIX)
-        fd_is_journal = g_str_has_prefix (addr.un.sun_path, "/run/systemd/journal/");
-
-      g_once_init_leave (&initialized, TRUE);
-    }
+  addr_len = sizeof(addr);
+  err = getpeername (output_fd, &addr.sa, &addr_len);
+  if (err == 0 && addr.storage.ss_family == AF_UNIX)
+    return g_str_has_prefix (addr.un.sun_path, "/run/systemd/journal/");
+#endif
 
-  return fd_is_journal;
-#else
   return FALSE;
-#endif
 }
 
 static void escape_string (GString *string);
@@ -2620,6 +2613,9 @@ g_log_writer_default (GLogLevelFlags   log_level,
                       gsize            n_fields,
                       gpointer         user_data)
 {
+  static gsize initialized = 0;
+  static gboolean stderr_is_journal = FALSE;
+
   g_return_val_if_fail (fields != NULL, G_LOG_WRITER_UNHANDLED);
   g_return_val_if_fail (n_fields > 0, G_LOG_WRITER_UNHANDLED);
 
@@ -2656,7 +2652,13 @@ g_log_writer_default (GLogLevelFlags   log_level,
     log_level |= G_LOG_FLAG_FATAL;
 
   /* Try logging to the systemd journal as first choice. */
-  if (g_log_writer_is_journald (fileno (stderr)) &&
+  if (g_once_init_enter (&initialized))
+    {
+      stderr_is_journal = g_log_writer_is_journald (fileno (stderr));
+      g_once_init_leave (&initialized, TRUE);
+    }
+
+  if (stderr_is_journal &&
       g_log_writer_journald (log_level, fields, n_fields, user_data) ==
       G_LOG_WRITER_HANDLED)
     goto handled;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]