[glib-networking/wip/openssl] Init OpenSSL locking
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib-networking/wip/openssl] Init OpenSSL locking
- Date: Tue, 19 Jan 2016 17:17:08 +0000 (UTC)
commit 1ed02285f3a388515676dabba47ec66cb07bbe50
Author: Paolo Borelli <pborelli gnome org>
Date: Tue Jan 19 15:56:48 2016 +0100
Init OpenSSL locking
tls/openssl/gtlsbackend-openssl.c | 84 +++++++++++++++++++++++++++++++++++++
1 files changed, 84 insertions(+), 0 deletions(-)
---
diff --git a/tls/openssl/gtlsbackend-openssl.c b/tls/openssl/gtlsbackend-openssl.c
index e483b5a..79a6d47 100644
--- a/tls/openssl/gtlsbackend-openssl.c
+++ b/tls/openssl/gtlsbackend-openssl.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <openssl/ssl.h>
+#include <openssl/crypto.h>
#include "gtlsbackend-openssl.h"
#include "gtlscertificate-openssl.h"
@@ -49,14 +50,86 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GTlsBackendOpenssl, g_tls_backend_openssl, G_TYP
G_IMPLEMENT_INTERFACE_DYNAMIC (G_TYPE_TLS_BACKEND,
g_tls_backend_openssl_interface_init))
+static GMutex *mutex_array = NULL;
+
+struct CRYPTO_dynlock_value {
+ GMutex mutex;
+};
+
+static unsigned long
+id_cb (void)
+{
+ return (unsigned long) g_thread_self ();
+}
+
+static void
+locking_cb (int mode,
+ int n,
+ const char *file,
+ int line)
+{
+ if (mode & CRYPTO_LOCK)
+ g_mutex_lock (&mutex_array[n]);
+ else
+ g_mutex_unlock (&mutex_array[n]);
+}
+
+static struct CRYPTO_dynlock_value *
+dyn_create_cb (const char *file,
+ int line)
+{
+ struct CRYPTO_dynlock_value *value = g_try_new (struct CRYPTO_dynlock_value, 1);
+
+ if (value)
+ g_mutex_init (&value->mutex);
+
+ return value;
+}
+
+static void
+dyn_lock_cb (int mode,
+ struct CRYPTO_dynlock_value *l,
+ const char *file,
+ int line)
+{
+ if (mode & CRYPTO_LOCK)
+ g_mutex_lock (&l->mutex);
+ else
+ g_mutex_unlock (&l->mutex);
+}
+
+static void
+dyn_destroy_cb (struct CRYPTO_dynlock_value *l,
+ const char *file,
+ int line)
+{
+ g_mutex_clear (&l->mutex);
+ g_free (l);
+}
+
static gpointer
gtls_openssl_init (gpointer data)
{
+ int i;
+
+ /* Initialize openssl threading */
+ mutex_array = g_malloc_n (CRYPTO_num_locks(), sizeof (GMutex));
+ for (i = 0; i < CRYPTO_num_locks (); ++i)
+ g_mutex_init(&mutex_array[i]);
+
+ CRYPTO_set_id_callback (id_cb);
+ CRYPTO_set_locking_callback (locking_cb);
+ CRYPTO_set_dynlock_create_callback (dyn_create_cb);
+ CRYPTO_set_dynlock_lock_callback (dyn_lock_cb);
+ CRYPTO_set_dynlock_destroy_callback (dyn_destroy_cb);
+
SSL_library_init ();
SSL_load_error_strings ();
+ OpenSSL_add_all_algorithms ();
/* Leak the module to keep it from being unloaded. */
g_type_plugin_use (g_type_get_plugin (G_TYPE_TLS_BACKEND_OPENSSL));
+
return NULL;
}
@@ -84,6 +157,8 @@ g_tls_backend_openssl_init (GTlsBackendOpenssl *backend)
static void
g_tls_backend_openssl_finalize (GObject *object)
{
+ int i;
+
GTlsBackendOpenssl *backend = G_TLS_BACKEND_OPENSSL (object);
GTlsBackendOpensslPrivate *priv;
@@ -92,6 +167,15 @@ g_tls_backend_openssl_finalize (GObject *object)
g_clear_object (&priv->default_database);
g_mutex_clear (&priv->mutex);
+ CRYPTO_set_id_callback (NULL);
+ CRYPTO_set_locking_callback (NULL);
+ CRYPTO_set_dynlock_create_callback (NULL);
+ CRYPTO_set_dynlock_lock_callback (NULL);
+ CRYPTO_set_dynlock_destroy_callback (NULL);
+ for (i = 0; i < CRYPTO_num_locks(); ++i)
+ g_mutex_clear (&mutex_array[i]);
+ g_free (mutex_array);
+
G_OBJECT_CLASS (g_tls_backend_openssl_parent_class)->finalize (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]