Print this page
4853 illumos-gate is not lint-clean when built with openssl 1.0

@@ -114,10 +114,11 @@
  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
  */
 
 #include "cryptlib.h"
 #include <openssl/safestack.h>
+#include <pthread.h>
 
 #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
 static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */
 #endif
 

@@ -179,10 +180,11 @@
 /* For applications that want a more dynamic way of handling threads, the
    following stack is used.  These are externally numbered with negative
    numbers.  */
 static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL;
 
+static pthread_mutex_t *illumos_openssl_locks;
 
 static void (MS_FAR *locking_callback)(int mode,int type,
         const char *file,int line)=0;
 static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
         int type,const char *file,int line)=0;

@@ -404,18 +406,95 @@
                                           const char *file,int line)
         {
         return(add_lock_callback);
         }
 
+/*
+ * This is the locking callback function which all applications will be
+ * using when CRYPTO_lock() is called.
+ */
+static void illumos_locking_callback(int mode, int type, const char *file,
+    int line)
+        {
+        if (mode & CRYPTO_LOCK)
+                {
+                pthread_mutex_lock(&illumos_openssl_locks[type]);
+                }
+        else
+                {
+                pthread_mutex_unlock(&illumos_openssl_locks[type]);
+                }
+        }
+
+
+/*
+ * This function is called when a child process is forked to setup its own
+ * global locking callback function ptr and mutexes.
+ */
+static void illumos_fork_child(void)
+        {
+                /*
+                 * clear locking_callback to indicate that locks should
+                 * be reinitialized.
+                 */
+                locking_callback = NULL;
+                illumos_locking_setup();
+        }
+
+/*
+ * This function allocates and initializes the global mutex array, and
+ * sets the locking callback.
+ */
+void illumos_locking_setup()
+        {
+        int i;
+        int num_locks;
+
+        /* locking callback is already setup. Nothing to do */
+        if (locking_callback != NULL)
+                {
+                return;
+                }
+
+        /*
+         * Set atfork handler so that child can setup its own mutexes and
+         * locking callbacks when it is forked
+         */
+        (void) pthread_atfork(NULL, NULL, illumos_fork_child);
+
+        /* allocate locks needed by OpenSSL  */
+        num_locks = CRYPTO_num_locks();
+        illumos_openssl_locks =
+            OPENSSL_malloc(sizeof (pthread_mutex_t) * num_locks);
+        if (illumos_openssl_locks == NULL)
+                {
+                fprintf(stderr,
+                        "illumos_locking_setup: memory allocation failure.\n");
+                abort();
+                }
+
+        /* initialize openssl mutexes */
+        for (i = 0; i < num_locks; i++)
+                {
+                pthread_mutex_init(&illumos_openssl_locks[i], NULL);
+                }
+        locking_callback = illumos_locking_callback;
+
+        }
+
 void CRYPTO_set_locking_callback(void (*func)(int mode,int type,
                                               const char *file,int line))
         {
         /* Calling this here ensures initialisation before any threads
          * are started.
          */
         OPENSSL_init();
-        locking_callback=func;
+
+        /*
+         * we now setup our own locking callback and mutexes, and disallow
+         * setting of another locking callback.
+         */
         }
 
 void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type,
                                               const char *file,int line))
         {