diff options
author | Rich Salz <rsalz@akamai.com> | 2016-02-10 00:39:29 -0500 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-02-10 08:27:06 -0500 |
commit | dd27f16e9a1d267da722a5aa37dba3e6a198afdb (patch) | |
tree | 467fdbf2645a006f11580fd6f525c72a9bcb223c /ssl | |
parent | 7984f082d5045b3a44839b74e4c72877b71ca48f (diff) |
Can't re-init after stop.
Remoce DYANMIC once-init stuff.
After the library is stopped, you can't restart it.
Reviewed-by: Matt Caswell <matt@openssl.org>
Diffstat (limited to 'ssl')
-rw-r--r-- | ssl/ssl_init.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/ssl/ssl_init.c b/ssl/ssl_init.c index f1aa2c401a..112def1f43 100644 --- a/ssl/ssl_init.c +++ b/ssl/ssl_init.c @@ -59,13 +59,15 @@ #include <openssl/crypto.h> #include <openssl/evp.h> +#include <assert.h> #include "ssl_locl.h" +static int stopped; + /* Implement "once" functionality */ #if !defined(OPENSSL_THREADS) typedef int OPENSSL_INIT_ONCE; # define OPENSSL_INIT_ONCE_STATIC_INIT 0 -# define OPENSSL_INIT_ONCE_DYNAMIC_INIT(once) (*(once) = 0) static void ossl_init_once_run(OPENSSL_INIT_ONCE *once, void (*init)(void)) { @@ -85,7 +87,6 @@ static void ossl_init_once_run(OPENSSL_INIT_ONCE *once, void (*init)(void)) */ typedef LONG OPENSSL_INIT_ONCE; # define OPENSSL_INIT_ONCE_STATIC_INIT 0 -# define OPENSSL_INIT_ONCE_DYNAMIC_INIT(once) (*(once) = 0) # define ONCE_UNINITED 0 # define ONCE_ININIT 1 @@ -113,8 +114,6 @@ static void ossl_init_once_run(OPENSSL_INIT_ONCE *once, void (*init)(void)) typedef INIT_ONCE OPENSSL_INIT_ONCE; # define OPENSSL_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT -# define OPENSSL_INIT_ONCE_DYNAMIC_INIT(once) \ - InitOnceInitialize((PINIT_ONCE)(once)) static BOOL CALLBACK once_cb(PINIT_ONCE once, PVOID initfp, PVOID *unused) { @@ -135,7 +134,6 @@ static void ossl_init_once_run(OPENSSL_INIT_ONCE *once, void (*init)(void)) typedef pthread_once_t OPENSSL_INIT_ONCE; # define OPENSSL_INIT_ONCE_STATIC_INIT PTHREAD_ONCE_INIT -# define OPENSSL_INIT_ONCE_DYNAMIC_INIT(once) (*(once) = PTHREAD_ONCE_INIT) static void ossl_init_once_run(OPENSSL_INIT_ONCE *once, void (*init)(void)) { @@ -266,6 +264,11 @@ static void ossl_init_no_load_ssl_strings(void) static void ssl_library_stop(void) { + /* Might be explicitly called and also by atexit */ + if (stopped) + return; + stopped = 1; + if (ssl_base_inited) { #ifndef OPENSSL_NO_COMP #ifdef OPENSSL_INIT_DEBUG @@ -273,8 +276,6 @@ static void ssl_library_stop(void) "SSL_COMP_free_compression_methods()\n"); #endif SSL_COMP_free_compression_methods(); - ssl_base_inited = 0; - OPENSSL_INIT_ONCE_DYNAMIC_INIT(&ssl_base); #endif } @@ -290,8 +291,6 @@ static void ssl_library_stop(void) * between the two libraries whether they have both been inited. */ ERR_free_strings(); - ssl_strings_inited = 0; - OPENSSL_INIT_ONCE_DYNAMIC_INIT(&ssl_strings); } } @@ -303,6 +302,9 @@ static void ssl_library_stop(void) void OPENSSL_INIT_ssl_library_start(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) { + /* XXX TODO WARNING To be updated to return a value not assert. */ + assert(!stopped); + OPENSSL_INIT_crypto_library_start(opts | OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS, settings); |