| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2017-08-04 13:10:41 +08:00
										 |  |  |  * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-05-18 02:51:34 +08:00
										 |  |  |  * Licensed under the OpenSSL license (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-24 07:05:07 +08:00
										 |  |  | #include "e_os.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:35:43 +08:00
										 |  |  | #include "internal/cryptlib_int.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #include <openssl/err.h>
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:35:43 +08:00
										 |  |  | #include "internal/rand_int.h"
 | 
					
						
							|  |  |  | #include "internal/bio.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #include <openssl/evp.h>
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:35:43 +08:00
										 |  |  | #include "internal/evp_int.h"
 | 
					
						
							|  |  |  | #include "internal/conf.h"
 | 
					
						
							|  |  |  | #include "internal/async.h"
 | 
					
						
							|  |  |  | #include "internal/engine.h"
 | 
					
						
							|  |  |  | #include "internal/comp.h"
 | 
					
						
							|  |  |  | #include "internal/err.h"
 | 
					
						
							|  |  |  | #include "internal/err_int.h"
 | 
					
						
							|  |  |  | #include "internal/objects.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | #include <assert.h>
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:35:43 +08:00
										 |  |  | #include "internal/thread_once.h"
 | 
					
						
							|  |  |  | #include "internal/dso.h"
 | 
					
						
							|  |  |  | #include "internal/store.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct global_lock_st { | 
					
						
							|  |  |  |     CRYPTO_RWLOCK *lock; | 
					
						
							|  |  |  |     const char *name; | 
					
						
							|  |  |  |     struct global_lock_st *next; | 
					
						
							|  |  |  | } GLOBAL_LOCK; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GLOBAL_LOCK *global_locks; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | static int stopped = 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 17:13:45 +08:00
										 |  |  | static void ossl_init_thread_stop(struct thread_local_inits_st *locals); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 23:23:57 +08:00
										 |  |  | static CRYPTO_THREAD_LOCAL threadstopkey; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void ossl_init_thread_stop_wrap(void *local) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ossl_init_thread_stop((struct thread_local_inits_st *)local); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 07:09:44 +08:00
										 |  |  | static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-02 23:23:57 +08:00
										 |  |  |     struct thread_local_inits_st *local = | 
					
						
							|  |  |  |         CRYPTO_THREAD_get_local(&threadstopkey); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (local == NULL && alloc) { | 
					
						
							| 
									
										
										
										
											2017-12-08 02:39:34 +08:00
										 |  |  |         local = OPENSSL_zalloc(sizeof(*local)); | 
					
						
							| 
									
										
										
										
											2017-06-19 19:33:41 +08:00
										 |  |  |         if (local != NULL && !CRYPTO_THREAD_set_local(&threadstopkey, local)) { | 
					
						
							|  |  |  |             OPENSSL_free(local); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-10 07:09:44 +08:00
										 |  |  |     if (!alloc) { | 
					
						
							| 
									
										
										
										
											2016-03-02 23:23:57 +08:00
										 |  |  |         CRYPTO_THREAD_set_local(&threadstopkey, NULL); | 
					
						
							| 
									
										
										
										
											2016-02-10 07:09:44 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return local; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 22:55:48 +08:00
										 |  |  | typedef struct ossl_init_stop_st OPENSSL_INIT_STOP; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | struct ossl_init_stop_st { | 
					
						
							|  |  |  |     void (*handler)(void); | 
					
						
							|  |  |  |     OPENSSL_INIT_STOP *next; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  | static CRYPTO_RWLOCK *glock_lock = NULL; | 
					
						
							|  |  |  | static CRYPTO_ONCE glock_once = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static OPENSSL_INIT_STOP *stop_handlers = NULL; | 
					
						
							| 
									
										
										
										
											2016-03-07 22:39:22 +08:00
										 |  |  | static CRYPTO_RWLOCK *init_lock = NULL; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE base = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int base_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_base) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_base: Setting up stop handlers\n"); | 
					
						
							| 
									
										
										
										
											2016-07-09 01:40:08 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_CRYPTO_MDEBUG
 | 
					
						
							|  |  |  |     ossl_malloc_setup_failures(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-03-02 23:23:57 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * We use a dummy thread local key here. We use the destructor to detect | 
					
						
							|  |  |  |      * when the thread is going to stop (where that feature is available) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     CRYPTO_THREAD_init_local(&threadstopkey, ossl_init_thread_stop_wrap); | 
					
						
							| 
									
										
										
										
											2016-02-17 22:54:33 +08:00
										 |  |  | #ifndef OPENSSL_SYS_UEFI
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  |     atexit(OPENSSL_cleanup); | 
					
						
							| 
									
										
										
										
											2016-02-17 22:54:33 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     /* Do not change this to glock's! */ | 
					
						
							|  |  |  |     if ((init_lock = CRYPTO_THREAD_lock_new()) == NULL) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     OPENSSL_cpuid_setup(); | 
					
						
							| 
									
										
										
										
											2016-11-15 07:58:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * BIG FAT WARNING! | 
					
						
							|  |  |  |      * Everything needed to be initialized in this function before threads | 
					
						
							|  |  |  |      * come along MUST happen before base_inited is set to 1, or we will | 
					
						
							|  |  |  |      * see race conditions. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     base_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 17:23:26 +08:00
										 |  |  | #if !defined(OPENSSL_NO_DSO) && !defined(OPENSSL_USE_NODELETE)
 | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  | # ifdef DSO_WIN32
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         HMODULE handle = NULL; | 
					
						
							|  |  |  |         BOOL ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* We don't use the DSO route for WIN32 because there is a better way */ | 
					
						
							|  |  |  |         ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 
					
						
							|  |  |  |                                 | GET_MODULE_HANDLE_EX_FLAG_PIN, | 
					
						
							|  |  |  |                                 (void *)&base_inited, &handle); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return (ret == TRUE) ? 1 : 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | # else
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * Deliberately leak a reference to ourselves. This will force the library | 
					
						
							| 
									
										
										
										
											2017-05-04 19:51:18 +08:00
										 |  |  |      * to remain loaded until the atexit() handler is run at process exit. | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         DSO *dso = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-04 19:51:18 +08:00
										 |  |  |         ERR_set_mark(); | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |         dso = DSO_dsobyaddr(&base_inited, DSO_FLAG_NO_UNLOAD_ON_FREE); | 
					
						
							|  |  |  |         DSO_free(dso); | 
					
						
							| 
									
										
										
										
											2017-05-04 19:51:18 +08:00
										 |  |  |         ERR_pop_to_mark(); | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 22:11:57 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE load_crypto_strings = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int load_crypto_strings_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_no_load_crypto_strings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Do nothing in this case */ | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_strings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-07-12 21:50:06 +08:00
										 |  |  |     int ret = 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 17:39:07 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * OPENSSL_NO_AUTOERRINIT is provided here to prevent at compile time | 
					
						
							|  |  |  |      * pulling in all the error strings during static linking | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | #if !defined(OPENSSL_NO_ERR) && !defined(OPENSSL_NO_AUTOERRINIT)
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_load_crypto_strings: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "err_load_crypto_strings_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-07-12 21:50:06 +08:00
										 |  |  |     ret = err_load_crypto_strings_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     load_crypto_strings_inited = 1; | 
					
						
							| 
									
										
										
										
											2017-06-06 23:35:43 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-07-12 21:50:06 +08:00
										 |  |  |     return ret; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE add_all_ciphers = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_ciphers) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time | 
					
						
							|  |  |  |      * pulling in all the ciphers during static linking | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_AUTOALGINIT
 | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_ciphers: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "openssl_add_all_ciphers_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     openssl_add_all_ciphers_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE add_all_digests = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_digests) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time | 
					
						
							|  |  |  |      * pulling in all the ciphers during static linking | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_AUTOALGINIT
 | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_digests: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "openssl_add_all_digests()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     openssl_add_all_digests_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_no_add_algs) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Do nothing */ | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE config = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int config_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-06-13 09:49:40 +08:00
										 |  |  | static const char *appname; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_config) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |             "OPENSSL_INIT: ossl_init_config: openssl_config(%s)\n", | 
					
						
							| 
									
										
										
										
											2016-06-13 09:49:40 +08:00
										 |  |  |             appname == NULL ? "NULL" : appname); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-06-13 09:49:40 +08:00
										 |  |  |     openssl_config_int(appname); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     config_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_no_config) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |             "OPENSSL_INIT: ossl_init_config: openssl_no_config_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     openssl_no_config_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     config_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE async = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int async_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_async) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_async: async_init()\n"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     if (!async_init()) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     async_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_openssl) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_openssl: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_openssl_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_openssl_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-24 23:19:00 +08:00
										 |  |  | # ifndef OPENSSL_NO_DEVCRYPTOENG
 | 
					
						
							|  |  |  | static CRYPTO_ONCE engine_devcrypto = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							|  |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_devcrypto) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #  ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_devcrypto: " | 
					
						
							|  |  |  |                     "engine_load_devcrypto_int()\n"); | 
					
						
							|  |  |  | #  endif
 | 
					
						
							|  |  |  |     engine_load_devcrypto_int(); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | # ifndef OPENSSL_NO_RDRAND
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE engine_rdrand = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_rdrand) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #  ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_rdrand: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_rdrand_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_rdrand_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE engine_dynamic = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_dynamic) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_dynamic: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_dynamic_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_dynamic_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | # ifndef OPENSSL_NO_STATIC_ENGINE
 | 
					
						
							|  |  |  | #  if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK)
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE engine_padlock = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_padlock) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #   ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_padlock: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_padlock_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #   endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_padlock_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | #  endif
 | 
					
						
							|  |  |  | #  if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE engine_capi = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_capi) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #   ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_capi: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_capi_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #   endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_capi_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | #  if !defined(OPENSSL_NO_AFALGENG)
 | 
					
						
							| 
									
										
										
										
											2016-03-15 21:06:34 +08:00
										 |  |  | static CRYPTO_ONCE engine_afalg = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_engine_afalg) | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #   ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_afalg: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_load_afalg_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | #   endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_load_afalg_int(); | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE zlib = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int zlib_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_zlib) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Do nothing - we need to know about this for the later cleanup */ | 
					
						
							|  |  |  |     zlib_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 17:13:45 +08:00
										 |  |  | static void ossl_init_thread_stop(struct thread_local_inits_st *locals) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Can't do much about this */ | 
					
						
							|  |  |  |     if (locals == NULL) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (locals->async) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " | 
					
						
							|  |  |  |                         "ASYNC_cleanup_thread()\n"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         ASYNC_cleanup_thread(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (locals->err_state) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " | 
					
						
							| 
									
										
										
										
											2016-05-08 23:01:09 +08:00
										 |  |  |                         "err_delete_thread_state()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-05-08 23:01:09 +08:00
										 |  |  |         err_delete_thread_state(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     OPENSSL_free(locals); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  | void OPENSSL_thread_stop(void) | 
					
						
							| 
									
										
										
										
											2016-02-09 17:13:45 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ossl_init_thread_stop( | 
					
						
							|  |  |  |         (struct thread_local_inits_st *)ossl_init_get_thread_local(0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | int ossl_init_thread_start(uint64_t opts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-19 19:33:41 +08:00
										 |  |  |     struct thread_local_inits_st *locals; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!OPENSSL_init_crypto(0, NULL)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     locals = ossl_init_get_thread_local(1); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (locals == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (opts & OPENSSL_INIT_THREAD_ASYNC) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: " | 
					
						
							|  |  |  |                         "marking thread for async\n"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         locals->async = 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (opts & OPENSSL_INIT_THREAD_ERR_STATE) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: " | 
					
						
							|  |  |  |                         "marking thread for err_state\n"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         locals->err_state = 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  | void OPENSSL_cleanup(void) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     OPENSSL_INIT_STOP *currhandler, *lasthandler; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 17:47:51 +08:00
										 |  |  |     /* If we've not been inited then no need to deinit */ | 
					
						
							|  |  |  |     if (!base_inited) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  |     /* Might be explicitly called and also by atexit */ | 
					
						
							|  |  |  |     if (stopped) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     stopped = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * Thread stop may not get automatically called by the thread library for | 
					
						
							|  |  |  |      * the very last thread in some situations, so call it directly. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ossl_init_thread_stop(ossl_init_get_thread_local(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     currhandler = stop_handlers; | 
					
						
							|  |  |  |     while (currhandler != NULL) { | 
					
						
							|  |  |  |         currhandler->handler(); | 
					
						
							|  |  |  |         lasthandler = currhandler; | 
					
						
							|  |  |  |         currhandler = currhandler->next; | 
					
						
							|  |  |  |         OPENSSL_free(lasthandler); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     stop_handlers = NULL; | 
					
						
							| 
									
										
										
										
											2016-03-07 22:39:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     CRYPTO_THREAD_lock_free(init_lock); | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     init_lock = NULL; | 
					
						
							| 
									
										
										
										
											2016-03-07 22:39:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * We assume we are single-threaded for this function, i.e. no race | 
					
						
							|  |  |  |      * conditions for the various "*_inited" vars below. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     if (zlib_inited) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  |         fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                         "comp_zlib_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |         comp_zlib_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 00:52:43 +08:00
										 |  |  |     if (async_inited) { | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							|  |  |  |                         "async_deinit()\n"); | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  |         async_deinit(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     if (load_crypto_strings_inited) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  |         fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                         "err_free_strings_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |         err_free_strings_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 23:23:57 +08:00
										 |  |  |     CRYPTO_THREAD_cleanup_local(&threadstopkey); | 
					
						
							| 
									
										
										
										
											2016-02-18 20:24:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "rand_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "conf_modules_free_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-09 19:52:50 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2016-03-09 08:53:38 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "engine_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-09 19:52:50 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "crypto_cleanup_all_ex_data_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "bio_sock_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-12 05:53:18 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							|  |  |  |                     "bio_cleanup()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "evp_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |                     "obj_cleanup_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-12 05:53:18 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " | 
					
						
							|  |  |  |                     "err_cleanup()\n"); | 
					
						
							| 
									
										
										
										
											2016-03-09 19:52:50 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * Note that cleanup order is important: | 
					
						
							| 
									
										
										
										
											2016-04-13 19:11:59 +08:00
										 |  |  |      * - rand_cleanup_int could call an ENGINE's RAND cleanup function so | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |      * must be called before engine_cleanup_int() | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |      * - ENGINEs use CRYPTO_EX_DATA and therefore, must be cleaned up | 
					
						
							|  |  |  |      * before the ex data handlers are wiped in CRYPTO_cleanup_all_ex_data(). | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |      * - conf_modules_free_int() can end up in ENGINE code so must be called | 
					
						
							|  |  |  |      * before engine_cleanup_int() | 
					
						
							| 
									
										
										
										
											2016-04-13 19:11:59 +08:00
										 |  |  |      * - ENGINEs and additional EVP algorithms might use added OIDs names so | 
					
						
							|  |  |  |      * obj_cleanup_int() must be called last | 
					
						
							| 
									
										
										
										
											2016-03-14 18:34:59 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     rand_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2017-09-01 05:16:22 +08:00
										 |  |  |     rand_drbg_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     conf_modules_free_int(); | 
					
						
							| 
									
										
										
										
											2016-03-11 17:52:52 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     engine_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2016-03-11 17:52:52 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-12-08 22:51:31 +08:00
										 |  |  |     ossl_store_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     crypto_cleanup_all_ex_data_int(); | 
					
						
							| 
									
										
										
										
											2016-03-12 05:53:18 +08:00
										 |  |  |     bio_cleanup(); | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |     evp_cleanup_int(); | 
					
						
							|  |  |  |     obj_cleanup_int(); | 
					
						
							| 
									
										
										
										
											2016-03-12 05:53:18 +08:00
										 |  |  |     err_cleanup(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     /* Free list of global locks. */ | 
					
						
							|  |  |  |     while (global_locks != NULL) { | 
					
						
							|  |  |  |         GLOBAL_LOCK *next = global_locks->next; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         free(global_locks); | 
					
						
							|  |  |  |         global_locks = next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     CRYPTO_THREAD_lock_free(glock_lock); | 
					
						
							|  |  |  |     glock_lock = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 17:47:51 +08:00
										 |  |  |     base_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * If this function is called with a non NULL settings value then it must be | 
					
						
							|  |  |  |  * called prior to any threads making calls to any OpenSSL functions, | 
					
						
							|  |  |  |  * i.e. passing a non-null settings value is assumed to be single-threaded. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  | int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |     static int stoperrset = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (stopped) { | 
					
						
							|  |  |  |         if (!stoperrset) { | 
					
						
							|  |  |  |             /*
 | 
					
						
							|  |  |  |              * We only ever set this once to avoid getting into an infinite | 
					
						
							|  |  |  |              * loop where the error system keeps trying to init and fails so | 
					
						
							|  |  |  |              * sets an error etc | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             stoperrset = 1; | 
					
						
							| 
									
										
										
										
											2016-02-11 04:20:48 +08:00
										 |  |  |             CRYPTOerr(CRYPTO_F_OPENSSL_INIT_CRYPTO, ERR_R_INIT_FAIL); | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-15 06:53:45 +08:00
										 |  |  |     if (!base_inited && !RUN_ONCE(&base, ossl_init_base)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&load_crypto_strings, | 
					
						
							|  |  |  |                          ossl_init_no_load_crypto_strings)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_LOAD_CRYPTO_STRINGS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&load_crypto_strings, ossl_init_load_crypto_strings)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_ADD_ALL_CIPHERS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&add_all_ciphers, ossl_init_no_add_algs)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ADD_ALL_CIPHERS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&add_all_ciphers, ossl_init_add_all_ciphers)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_ADD_ALL_DIGESTS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&add_all_digests, ossl_init_no_add_algs)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ADD_ALL_DIGESTS) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&add_all_digests, ossl_init_add_all_digests)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 01:55:08 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ATFORK) | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  |             && !openssl_init_fork_handlers()) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&config, ossl_init_no_config)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (opts & OPENSSL_INIT_LOAD_CONFIG) { | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         int ret; | 
					
						
							| 
									
										
										
										
											2016-03-07 22:39:22 +08:00
										 |  |  |         CRYPTO_THREAD_write_lock(init_lock); | 
					
						
							| 
									
										
										
										
											2016-06-13 09:49:40 +08:00
										 |  |  |         appname = (settings == NULL) ? NULL : settings->appname; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |         ret = RUN_ONCE(&config, ossl_init_config); | 
					
						
							| 
									
										
										
										
											2016-03-07 22:39:22 +08:00
										 |  |  |         CRYPTO_THREAD_unlock(init_lock); | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         if (!ret) | 
					
						
							|  |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ASYNC) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&async, ossl_init_async)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-03-18 01:06:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_OPENSSL) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_openssl, ossl_init_engine_openssl)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2017-03-24 23:19:00 +08:00
										 |  |  | # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_DEVCRYPTOENG)
 | 
					
						
							|  |  |  |     if ((opts & OPENSSL_INIT_ENGINE_CRYPTODEV) | 
					
						
							|  |  |  |             && !RUN_ONCE(&engine_devcrypto, ossl_init_engine_devcrypto)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # ifndef OPENSSL_NO_RDRAND
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_RDRAND) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_rdrand, ossl_init_engine_rdrand)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_DYNAMIC) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_dynamic, ossl_init_engine_dynamic)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # ifndef OPENSSL_NO_STATIC_ENGINE
 | 
					
						
							|  |  |  | #  if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK)
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_PADLOCK) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_padlock, ossl_init_engine_padlock)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #  endif
 | 
					
						
							|  |  |  | #  if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_CAPI) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_capi, ossl_init_engine_capi)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | #  if !defined(OPENSSL_NO_AFALGENG)
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ENGINE_AFALG) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&engine_afalg, ossl_init_engine_afalg)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | # endif
 | 
					
						
							|  |  |  |     if (opts & (OPENSSL_INIT_ENGINE_ALL_BUILTIN | 
					
						
							| 
									
										
										
										
											2016-08-17 21:06:23 +08:00
										 |  |  |                 | OPENSSL_INIT_ENGINE_OPENSSL | 
					
						
							| 
									
										
										
										
											2016-02-23 16:01:01 +08:00
										 |  |  |                 | OPENSSL_INIT_ENGINE_AFALG)) { | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |         ENGINE_register_all_complete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_ZLIB) | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |             && !RUN_ONCE(&zlib, ossl_init_zlib)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-03-12 04:13:19 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  | int OPENSSL_atexit(void (*handler)(void)) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     OPENSSL_INIT_STOP *newhand; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 17:23:26 +08:00
										 |  |  | #if !defined(OPENSSL_NO_DSO) && !defined(OPENSSL_USE_NODELETE)
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         union { | 
					
						
							|  |  |  |             void *sym; | 
					
						
							|  |  |  |             void (*func)(void); | 
					
						
							|  |  |  |         } handlersym; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         handlersym.func = handler; | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  | # ifdef DSO_WIN32
 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             HMODULE handle = NULL; | 
					
						
							|  |  |  |             BOOL ret; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  |             /*
 | 
					
						
							|  |  |  |              * We don't use the DSO route for WIN32 because there is a better | 
					
						
							|  |  |  |              * way | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 
					
						
							|  |  |  |                                     | GET_MODULE_HANDLE_EX_FLAG_PIN, | 
					
						
							|  |  |  |                                     handlersym.sym, &handle); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!ret) | 
					
						
							|  |  |  |                 return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | # else
 | 
					
						
							|  |  |  |         /*
 | 
					
						
							|  |  |  |          * Deliberately leak a reference to the handler. This will force the | 
					
						
							|  |  |  |          * library/code containing the handler to remain loaded until we run the | 
					
						
							|  |  |  |          * atexit handler. If -znodelete has been used then this is | 
					
						
							| 
									
										
										
										
											2017-08-04 13:10:41 +08:00
										 |  |  |          * unnecessary. | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  |          */ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             DSO *dso = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-04 19:51:18 +08:00
										 |  |  |             ERR_set_mark(); | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  |             dso = DSO_dsobyaddr(handlersym.sym, DSO_FLAG_NO_UNLOAD_ON_FREE); | 
					
						
							|  |  |  |             DSO_free(dso); | 
					
						
							| 
									
										
										
										
											2017-05-04 19:51:18 +08:00
										 |  |  |             ERR_pop_to_mark(); | 
					
						
							| 
									
										
										
										
											2016-10-28 18:03:22 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-18 22:11:57 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:13:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     newhand = OPENSSL_malloc(sizeof(*newhand)); | 
					
						
							|  |  |  |     if (newhand == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     newhand->handler = handler; | 
					
						
							|  |  |  |     newhand->next = stop_handlers; | 
					
						
							|  |  |  |     stop_handlers = newhand; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  | #ifndef OPENSSL_SYS_UNIX
 | 
					
						
							|  |  |  | CRYPTO_RWLOCK *CRYPTO_THREAD_glock_new(const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return CRYPTO_THREAD_lock_new(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  | #else
 | 
					
						
							|  |  |  | DEFINE_RUN_ONCE_STATIC(glock_init) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     glock_lock = CRYPTO_THREAD_lock_new(); | 
					
						
							|  |  |  |     return glock_lock != NULL; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Create a new global lock, return NULL on error. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | CRYPTO_RWLOCK *CRYPTO_THREAD_glock_new(const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     GLOBAL_LOCK *newlock; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     if (glock_lock == NULL && !RUN_ONCE(&glock_once, glock_init)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     if ((newlock = malloc(sizeof(*newlock))) == NULL) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     if ((newlock->lock = CRYPTO_THREAD_lock_new()) == NULL) { | 
					
						
							|  |  |  |         free(newlock); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     newlock->name = name; | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     CRYPTO_THREAD_write_lock(glock_lock); | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     newlock->next = global_locks; | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     global_locks = newlock; | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     CRYPTO_THREAD_unlock(glock_lock); | 
					
						
							|  |  |  |     return newlock->lock; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Unlock all global locks. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void unlock_all(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     GLOBAL_LOCK *lp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     CRYPTO_THREAD_write_lock(glock_lock); | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     for (lp = global_locks; lp != NULL; lp = lp->next) | 
					
						
							|  |  |  |         CRYPTO_THREAD_unlock(lp->lock); | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     CRYPTO_THREAD_unlock(glock_lock); | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * The following three functions are for OpenSSL developers.  This is | 
					
						
							|  |  |  |  * where we set/reset state across fork (called via pthread_atfork when | 
					
						
							|  |  |  |  * it exists, or manually by the application when it doesn't). | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * WARNING!  If you put code in either OPENSSL_fork_parent or | 
					
						
							|  |  |  |  * OPENSSL_fork_child, you MUST MAKE SURE that they are async-signal- | 
					
						
							|  |  |  |  * safe.  See this link, for example: | 
					
						
							|  |  |  |  *      http://man7.org/linux/man-pages/man7/signal-safety.7.html
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OPENSSL_fork_prepare(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     GLOBAL_LOCK *lp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     CRYPTO_THREAD_write_lock(glock_lock); | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     for (lp = global_locks; lp != NULL; lp = lp->next) | 
					
						
							|  |  |  |         CRYPTO_THREAD_write_lock(lp->lock); | 
					
						
							| 
									
										
										
										
											2017-08-31 04:40:52 +08:00
										 |  |  |     CRYPTO_THREAD_unlock(glock_lock); | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OPENSSL_fork_parent(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     unlock_all(); | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OPENSSL_fork_child(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-30 03:24:17 +08:00
										 |  |  |     unlock_all(); | 
					
						
							| 
									
										
										
										
											2017-08-07 06:12:28 +08:00
										 |  |  |     rand_fork(); | 
					
						
							| 
									
										
										
										
											2017-06-23 02:00:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 |