i_free(ctx);
}
-static void ssl_iostream_deinit_global(void)
+void openssl_iostream_global_deinit(void)
{
if (ssl_iostream_engine != NULL)
ENGINE_finish(ssl_iostream_engine);
if (ssl_global_initialized)
return 0;
- atexit(ssl_iostream_deinit_global);
ssl_global_initialized = TRUE;
SSL_library_init();
SSL_load_error_strings();
*error_r = t_strdup_printf(
"Unknown ssl_crypto_device: %s",
set->crypto_device);
- ssl_iostream_deinit_global();
+ /* we'll deinit at exit in any case */
return -1;
}
ENGINE_init(ssl_iostream_engine);
}
const struct iostream_ssl_vfuncs ssl_vfuncs = {
+ openssl_iostream_global_deinit,
+
openssl_iostream_context_init_client,
openssl_iostream_context_init_server,
openssl_iostream_context_deinit,
struct ssl_iostream_context **ctx_r,
const char **error_r);
void openssl_iostream_context_deinit(struct ssl_iostream_context *ctx);
+void openssl_iostream_global_deinit(void);
int openssl_iostream_load_key(const struct ssl_iostream_settings *set,
EVP_PKEY **pkey_r, const char **error_r);
#include "iostream-ssl.h"
struct iostream_ssl_vfuncs {
+ void (*global_deinit)(void);
int (*context_init_client)(const struct ssl_iostream_settings *set,
struct ssl_iostream_context **ctx_r,
const char **error_r);
#ifdef HAVE_SSL
static void ssl_module_unload(void)
{
+ module_dir_deinit(ssl_module);
+ ssl_vfuncs->global_deinit();
module_dir_unload(&ssl_module);
}
#endif
return -1;
}
- atexit(ssl_module_unload);
+ lib_atexit(ssl_module_unload);
ssl_module_loaded = TRUE;
return 0;
#else