[glib-networking] gnutls: revert part of the gcrypt-removing patch
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib-networking] gnutls: revert part of the gcrypt-removing patch
- Date: Sun, 4 Dec 2011 12:02:18 +0000 (UTC)
commit d0519f819f0fa3305813fef82cdd525003881801
Author: Dan Winship <danw gnome org>
Date: Sun Dec 4 12:59:51 2011 +0100
gnutls: revert part of the gcrypt-removing patch
I thought we could get rid of the "keep the module from being
unloaded" hack now, but it appears that we can't.
tls/gnutls/gtlsbackend-gnutls.c | 27 +++++++++++++++++----------
1 files changed, 17 insertions(+), 10 deletions(-)
---
diff --git a/tls/gnutls/gtlsbackend-gnutls.c b/tls/gnutls/gtlsbackend-gnutls.c
index 3597753..493a044 100644
--- a/tls/gnutls/gtlsbackend-gnutls.c
+++ b/tls/gnutls/gtlsbackend-gnutls.c
@@ -37,14 +37,11 @@ struct _GTlsBackendGnutlsPrivate
GTlsDatabase *default_database;
};
-static void gtls_gnutls_init (void);
static void g_tls_backend_gnutls_interface_init (GTlsBackendInterface *iface);
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GTlsBackendGnutls, g_tls_backend_gnutls, G_TYPE_OBJECT, 0,
G_IMPLEMENT_INTERFACE_DYNAMIC (G_TYPE_TLS_BACKEND,
- g_tls_backend_gnutls_interface_init);
- gtls_gnutls_init ();
- )
+ g_tls_backend_gnutls_interface_init);)
#ifdef GTLS_GNUTLS_DEBUG
static void
@@ -54,25 +51,35 @@ gtls_log_func (int level, const char *msg)
}
#endif
-static void
-gtls_gnutls_init (void)
+static gpointer
+gtls_gnutls_init (gpointer data)
{
gnutls_global_init ();
#ifdef GTLS_GNUTLS_DEBUG
gnutls_global_set_log_function (gtls_log_func);
gnutls_global_set_log_level (9);
+#endif
- /* Leak the module to keep it from being unloaded and breaking
- * the pointer to gtls_log_func().
- */
+ /* Leak the module to keep it from being unloaded. */
g_type_plugin_use (g_type_get_plugin (G_TYPE_TLS_BACKEND_GNUTLS));
-#endif
+ return NULL;
}
+static GOnce gnutls_inited = G_ONCE_INIT;
+
static void
g_tls_backend_gnutls_init (GTlsBackendGnutls *backend)
{
+ /* Once we call gtls_gnutls_init(), we can't allow the module to be
+ * unloaded (since if gnutls gets unloaded but gcrypt doesn't, then
+ * gcrypt will have dangling pointers to gnutls's mutex functions).
+ * So we initialize it from here rather than at class init time so
+ * that it doesn't happen unless the app is actually using TLS (as
+ * opposed to just calling g_io_modules_scan_all_in_directory()).
+ */
+ g_once (&gnutls_inited, gtls_gnutls_init, NULL);
+
backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (backend, G_TYPE_TLS_BACKEND_GNUTLS, GTlsBackendGnutlsPrivate);
g_mutex_init (&backend->priv->mutex);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]