]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-ssl-iostream: Deinitialization fixes.
authorTimo Sirainen <tss@iki.fi>
Tue, 6 Aug 2013 13:07:50 +0000 (16:07 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 6 Aug 2013 13:07:50 +0000 (16:07 +0300)
src/lib-ssl-iostream/iostream-openssl-context.c
src/lib-ssl-iostream/iostream-openssl.c
src/lib-ssl-iostream/iostream-openssl.h
src/lib-ssl-iostream/iostream-ssl-private.h
src/lib-ssl-iostream/iostream-ssl.c

index 37cfc636a576b7a0e61bc3414e6fd179b93249f3..81133305b457a1e27515087492e0d697237be0b0 100644 (file)
@@ -561,7 +561,7 @@ void openssl_iostream_context_deinit(struct ssl_iostream_context *ctx)
        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);
@@ -581,7 +581,6 @@ static int ssl_iostream_init_global(const struct ssl_iostream_settings *set,
        if (ssl_global_initialized)
                return 0;
 
-       atexit(ssl_iostream_deinit_global);
        ssl_global_initialized = TRUE;
        SSL_library_init();
        SSL_load_error_strings();
@@ -603,7 +602,7 @@ static int ssl_iostream_init_global(const struct ssl_iostream_settings *set,
                        *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);
index dd9be45a5c492743f09000c66c853569ba1836a9..e0cf98b47fed0c00ae82c2d92f3270a8df3c68d9 100644 (file)
@@ -687,6 +687,8 @@ openssl_iostream_get_last_error(struct ssl_iostream *ssl_io)
 }
 
 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,
index 6258961db5b5a2e6156f73cfd2d4295d96c519b4..44904019eec086f2ce46f86149971869043d4932 100644 (file)
@@ -62,6 +62,7 @@ int openssl_iostream_context_init_server(const struct ssl_iostream_settings *set
                                         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);
index 9c8c432e99a9662272a880daa6311fa1d1bd2b6a..30968d5f65a4436283aa3b7eb4c30d7475273a54 100644 (file)
@@ -4,6 +4,7 @@
 #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);
index ce639ce4bdd4a457562306879c8d91fcf0053116..5ee8a63d8f9950396c0b80020fdfa6b952dfa42b 100644 (file)
@@ -15,6 +15,8 @@ static const struct iostream_ssl_vfuncs *ssl_vfuncs = NULL;
 #ifdef HAVE_SSL
 static void ssl_module_unload(void)
 {
+       module_dir_deinit(ssl_module);
+       ssl_vfuncs->global_deinit();
        module_dir_unload(&ssl_module);
 }
 #endif
@@ -38,7 +40,7 @@ static int ssl_module_load(const char **error_r)
                return -1;
        }
 
-       atexit(ssl_module_unload);
+       lib_atexit(ssl_module_unload);
        ssl_module_loaded = TRUE;
        return 0;
 #else