From 9665773d8ae5eaf1679574b15dab133ab9d0de72 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Wed, 1 Oct 2014 19:23:46 +0200 Subject: idevice: Fix several memory leaks on deinitialization of OpenSSL --- src/idevice.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/idevice.c b/src/idevice.c index 3b903c0..8cacf4c 100644 --- a/src/idevice.c +++ b/src/idevice.c @@ -35,6 +35,7 @@ #include #ifdef HAVE_OPENSSL +#include #include #else #include @@ -83,14 +84,19 @@ static void internal_idevice_deinit(void) { #ifdef HAVE_OPENSSL int i; - if (!mutex_buf) - return; - CRYPTO_set_id_callback(NULL); - CRYPTO_set_locking_callback(NULL); - for (i = 0; i < CRYPTO_num_locks(); i++) - mutex_destroy(&mutex_buf[i]); - free(mutex_buf); - mutex_buf = NULL; + if (mutex_buf) { + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + for (i = 0; i < CRYPTO_num_locks(); i++) + mutex_destroy(&mutex_buf[i]); + free(mutex_buf); + mutex_buf = NULL; + } + + EVP_cleanup(); + CRYPTO_cleanup_all_ex_data(); + sk_SSL_COMP_free(SSL_COMP_get_compression_methods()); + ERR_remove_thread_state(NULL); #else gnutls_global_deinit(); #endif @@ -710,6 +716,8 @@ idevice_error_t idevice_connection_enable_ssl(idevice_connection_t connection) ret = IDEVICE_E_SUCCESS; debug_info("SSL mode enabled, cipher: %s", SSL_get_cipher(ssl)); } + /* required for proper multi-thread clean up to prevent leaks */ + ERR_remove_thread_state(NULL); #else ssl_data_t ssl_data_loc = (ssl_data_t)malloc(sizeof(struct ssl_data_private)); -- cgit v1.1-32-gdbae