Paul Wouters 63b8685
Index: daemon/daemon.c
Paul Wouters 63b8685
===================================================================
Paul Wouters 63b8685
--- daemon/daemon.c	(revision 2732)
Paul Wouters 63b8685
+++ daemon/daemon.c	(revision 2733)
Paul Wouters 63b8685
@@ -209,6 +209,10 @@
Paul Wouters 63b8685
 	comp_meth = (void*)SSL_COMP_get_compression_methods();
Paul Wouters 63b8685
 #  endif
Paul Wouters 63b8685
 	(void)SSL_library_init();
Paul Wouters 63b8685
+#  if defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
Paul Wouters 63b8685
+	if(!ub_openssl_lock_init())
Paul Wouters 63b8685
+		fatal_exit("could not init openssl locks");
Paul Wouters 63b8685
+#  endif
Paul Wouters 63b8685
 #elif defined(HAVE_NSS)
Paul Wouters 63b8685
 	if(NSS_NoDB_Init(NULL) != SECSuccess)
Paul Wouters 63b8685
 		fatal_exit("could not init NSS");
Paul Wouters 63b8685
@@ -568,6 +572,9 @@
Paul Wouters 63b8685
 	ERR_remove_state(0);
Paul Wouters 63b8685
 	ERR_free_strings();
Paul Wouters 63b8685
 	RAND_cleanup();
Paul Wouters 63b8685
+#  if defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
Paul Wouters 63b8685
+	ub_openssl_lock_delete();
Paul Wouters 63b8685
+#  endif
Paul Wouters 63b8685
 #elif defined(HAVE_NSS)
Paul Wouters 63b8685
 	NSS_Shutdown();
Paul Wouters 63b8685
 #endif /* HAVE_SSL or HAVE_NSS */
Paul Wouters 63b8685
Index: util/net_help.c
Paul Wouters 63b8685
===================================================================
Paul Wouters 63b8685
--- util/net_help.c	(revision 2732)
Paul Wouters 63b8685
+++ util/net_help.c	(revision 2733)
Paul Wouters 63b8685
@@ -725,3 +725,54 @@
Paul Wouters 63b8685
 	return NULL;
Paul Wouters 63b8685
 #endif
Paul Wouters 63b8685
 }
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+/** global lock list for openssl locks */
Paul Wouters 63b8685
+static lock_basic_t *ub_openssl_locks = NULL;
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+/** callback that gets thread id for openssl */
Paul Wouters 63b8685
+static unsigned long
Paul Wouters 63b8685
+ub_crypto_id_cb(void)
Paul Wouters 63b8685
+{
Paul Wouters 63b8685
+	return (unsigned long)ub_thread_self();
Paul Wouters 63b8685
+}
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+static void
Paul Wouters 63b8685
+ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
Paul Wouters 63b8685
+	int ATTR_UNUSED(line))
Paul Wouters 63b8685
+{
Paul Wouters 63b8685
+	if((mode&CRYPTO_LOCK)) {
Paul Wouters 63b8685
+		lock_basic_lock(&ub_openssl_locks[type]);
Paul Wouters 63b8685
+	} else {
Paul Wouters 63b8685
+		lock_basic_unlock(&ub_openssl_locks[type]);
Paul Wouters 63b8685
+	}
Paul Wouters 63b8685
+}
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+int ub_openssl_lock_init(void)
Paul Wouters 63b8685
+{
Paul Wouters 63b8685
+#ifdef OPENSSL_THREADS
Paul Wouters 63b8685
+	size_t i;
Paul Wouters 63b8685
+	ub_openssl_locks = (lock_basic_t*)malloc(
Paul Wouters 63b8685
+		sizeof(lock_basic_t)*CRYPTO_num_locks());
Paul Wouters 63b8685
+	if(!ub_openssl_locks)
Paul Wouters 63b8685
+		return 0;
Paul Wouters 63b8685
+	for(i=0; i
Paul Wouters 63b8685
+		lock_basic_init(&ub_openssl_locks[i]);
Paul Wouters 63b8685
+	}
Paul Wouters 63b8685
+	CRYPTO_set_id_callback(&ub_crypto_id_cb);
Paul Wouters 63b8685
+	CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
Paul Wouters 63b8685
+#endif /* OPENSSL_THREADS */
Paul Wouters 63b8685
+	return 1;
Paul Wouters 63b8685
+}
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+void ub_openssl_lock_delete(void)
Paul Wouters 63b8685
+{
Paul Wouters 63b8685
+#ifdef OPENSSL_THREADS
Paul Wouters 63b8685
+	size_t i;
Paul Wouters 63b8685
+	if(!ub_openssl_locks)
Paul Wouters 63b8685
+		return;
Paul Wouters 63b8685
+	for(i=0; i
Paul Wouters 63b8685
+		lock_basic_destroy(&ub_openssl_locks[i]);
Paul Wouters 63b8685
+	}
Paul Wouters 63b8685
+#endif /* OPENSSL_THREADS */
Paul Wouters 63b8685
+}
Paul Wouters 63b8685
+
Paul Wouters 63b8685
Index: util/net_help.h
Paul Wouters 63b8685
===================================================================
Paul Wouters 63b8685
--- util/net_help.h	(revision 2732)
Paul Wouters 63b8685
+++ util/net_help.h	(revision 2733)
Paul Wouters 63b8685
@@ -369,4 +369,15 @@
Paul Wouters 63b8685
  */
Paul Wouters 63b8685
 void* outgoing_ssl_fd(void* sslctx, int fd);
Paul Wouters 63b8685
 
Paul Wouters 63b8685
+/**
Paul Wouters 63b8685
+ * Initialize openssl locking for thread safety
Paul Wouters 63b8685
+ * @return false on failure (alloc failure).
Paul Wouters 63b8685
+ */
Paul Wouters 63b8685
+int ub_openssl_lock_init(void);
Paul Wouters 63b8685
+
Paul Wouters 63b8685
+/**
Paul Wouters 63b8685
+ * De-init the allocated openssl locks
Paul Wouters 63b8685
+ */
Paul Wouters 63b8685
+void ub_openssl_lock_delete(void);
Paul Wouters 63b8685
+
Paul Wouters 63b8685
 #endif /* NET_HELP_H */