return ret;
}
-/**
- * gnutls_global_deinit:
- *
- * This function deinitializes the global data, that were initialized
- * using gnutls_global_init().
- *
- **/
-void gnutls_global_deinit(void)
+static void _gnutls_global_deinit(unsigned destructor)
{
GNUTLS_STATIC_MUTEX_LOCK(global_init_mutex);
+
if (_gnutls_init == 1) {
_gnutls_init = 0;
gnutls_crypto_deinit();
asn1_delete_structure(&_gnutls_pkix1_asn);
_gnutls_crypto_deregister();
gnutls_system_global_deinit();
-
_gnutls_cryptodev_deinit();
+
#ifdef ENABLE_PKCS11
- gnutls_pkcs11_deinit();
+ /* Do not try to deinitialize the PKCS #11 libraries
+ * from the destructor. If we do and the PKCS #11 modules
+ * are already being unloaded, we may crash.
+ */
+ if (destructor == 0) {
+ gnutls_pkcs11_deinit();
+ }
#endif
gnutls_mutex_deinit(&_gnutls_file_mutex);
GNUTLS_STATIC_MUTEX_UNLOCK(global_init_mutex);
}
+/**
+ * gnutls_global_deinit:
+ *
+ * This function deinitializes the global data, that were initialized
+ * using gnutls_global_init().
+ *
+ **/
+void gnutls_global_deinit(void)
+{
+ return _gnutls_global_deinit(0);
+}
+
/**
* gnutls_check_version:
* @req_version: version string to compare with, or %NULL.
_DESTRUCTOR static void lib_deinit(void)
{
- gnutls_global_deinit();
+ _gnutls_global_deinit(1);
}