From 356f819e50350ce906efa39623357c68c3bcc670 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Mon, 20 Jun 2016 09:40:48 +0100 Subject: [PATCH] Initialise OpenSSL just once Avoid multiple initializations of this library. Also initialize using thread safe code to avoid possible race conditions. Signed-off-by: Frediano Ziglio Acked-by: Pavel Grunt --- server/reds.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/server/reds.c b/server/reds.c index b3585428..df6c10eb 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2801,8 +2801,19 @@ static void openssl_thread_setup(void) CRYPTO_set_locking_callback(pthreads_locking_callback); } +static gpointer openssl_global_init(gpointer arg) +{ + SSL_library_init(); + SSL_load_error_strings(); + + openssl_thread_setup(); + + return NULL; +} + static int reds_init_ssl(RedsState *reds) { + static GOnce openssl_once = G_ONCE_INIT; #if OPENSSL_VERSION_NUMBER >= 0x10000000L const SSL_METHOD *ssl_method; #else @@ -2814,8 +2825,7 @@ static int reds_init_ssl(RedsState *reds) long ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; /* Global system initialization*/ - SSL_library_init(); - SSL_load_error_strings(); + g_once(&openssl_once, openssl_global_init, NULL); /* Create our context*/ /* SSLv23_method() handles TLSv1.x in addition to SSLv2/v3 */ @@ -2879,8 +2889,6 @@ static int reds_init_ssl(RedsState *reds) } } - openssl_thread_setup(); - #ifndef SSL_OP_NO_COMPRESSION STACK *cmp_stack = SSL_COMP_get_compression_methods(); sk_zero(cmp_stack);