util: always initialize the server log mutex 17/11717/10
authorMichael Meffie <mmeffie@sinenomine.net>
Wed, 4 Feb 2015 02:07:34 +0000 (21:07 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Mon, 25 Apr 2016 04:02:55 +0000 (00:02 -0400)
Be sure to always initialize the server log mutex. Use pthread_once to
ensure the mutex is initialized only once.

Before this change the server log mutex was not properly initialized
with pthread_mutex_init when logging to the syslog.

Change-Id: Ief2ee6b373f7309bc05061f7413b6ff623b86e31
Reviewed-on: https://gerrit.openafs.org/11717
Reviewed-by: Chas Williams <3chas3@gmail.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/util/serverLog.c

index fb4862f..b7b1465 100644 (file)
@@ -34,6 +34,7 @@
 
 #if defined(AFS_PTHREAD_ENV)
 #include <pthread.h>
+static pthread_once_t serverLogOnce = PTHREAD_ONCE_INIT;
 static pthread_mutex_t serverLogMutex;
 #define LOCK_SERVERLOG() opr_Verify(pthread_mutex_lock(&serverLogMutex) == 0)
 #define UNLOCK_SERVERLOG() opr_Verify(pthread_mutex_unlock(&serverLogMutex) == 0)
@@ -312,6 +313,14 @@ SetupLogSignals(void)
 #endif
 }
 
+#if defined(AFS_PTHREAD_ENV)
+static void
+InitServerLogMutex(void)
+{
+    opr_Verify(pthread_mutex_init(&serverLogMutex, NULL) == 0);
+}
+#endif /* AFS_PTHREAD_ENV */
+
 int
 OpenLog(const char *fileName)
 {
@@ -327,7 +336,13 @@ OpenLog(const char *fileName)
 
 #ifndef AFS_NT40_ENV
     struct stat statbuf;
+#endif
 
+#if defined(AFS_PTHREAD_ENV)
+    opr_Verify(pthread_once(&serverLogOnce, InitServerLogMutex) == 0);
+#endif /* AFS_PTHREAD_ENV */
+
+#ifndef AFS_NT40_ENV
     if (serverLogSyslog) {
        openlog(serverLogSyslogTag, LOG_PID, serverLogSyslogFacility);
        return (0);
@@ -388,10 +403,6 @@ OpenLog(const char *fileName)
 #endif
     }
 
-#if defined(AFS_PTHREAD_ENV)
-    opr_Verify(pthread_mutex_init(&serverLogMutex, NULL) == 0);
-#endif /* AFS_PTHREAD_ENV */
-
     serverLogFD = tempfd;
 
     return 0;