/*
- * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
#include "internal/dso.h"
#include "internal/store.h"
-
-typedef struct global_lock_st {
- CRYPTO_RWLOCK *lock;
- const char *name;
- struct global_lock_st *next;
-} GLOBAL_LOCK;
-
-static GLOBAL_LOCK *global_locks;
-
static int stopped = 0;
static void ossl_init_thread_stop(struct thread_local_inits_st *locals);
OPENSSL_INIT_STOP *next;
};
-static CRYPTO_RWLOCK *glock_lock = NULL;
-
static OPENSSL_INIT_STOP *stop_handlers = NULL;
static CRYPTO_RWLOCK *init_lock = NULL;
#ifndef OPENSSL_SYS_UEFI
atexit(OPENSSL_cleanup);
#endif
- /* Do not change this to glock's! */
if ((init_lock = CRYPTO_THREAD_lock_new()) == NULL)
return 0;
OPENSSL_cpuid_setup();
obj_cleanup_int();
err_cleanup();
- /* 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;
+ CRYPTO_secure_malloc_done();
base_inited = 0;
}
return 1;
}
-#ifndef OPENSSL_SYS_UNIX
-CRYPTO_RWLOCK *CRYPTO_THREAD_glock_new(const char *name)
-{
- return CRYPTO_THREAD_lock_new();
-}
-
-#else
-DEFINE_RUN_ONCE_STATIC(glock_init)
-{
- glock_lock = CRYPTO_THREAD_lock_new();
- return glock_lock != NULL;
-}
-
-/*
- * Create a new global lock, return NULL on error.
- */
-CRYPTO_RWLOCK *CRYPTO_THREAD_glock_new(const char *name)
-{
- static CRYPTO_ONCE glock_once = CRYPTO_ONCE_STATIC_INIT;
- GLOBAL_LOCK *newlock;
-
- 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;
- }
- newlock->name = name;
- CRYPTO_THREAD_write_lock(glock_lock);
- newlock->next = global_locks;
- global_locks = newlock;
- CRYPTO_THREAD_unlock(glock_lock);
- return newlock->lock;
-}
-
-/*
- * Unlock all global locks.
- */
-static void unlock_all(void)
-{
- GLOBAL_LOCK *lp;
-
- CRYPTO_THREAD_write_lock(glock_lock);
- for (lp = global_locks; lp != NULL; lp = lp->next)
- CRYPTO_THREAD_unlock(lp->lock);
- CRYPTO_THREAD_unlock(glock_lock);
-}
-
+#ifdef OPENSSL_SYS_UNIX
/*
* The following three functions are for OpenSSL developers. This is
* where we set/reset state across fork (called via pthread_atfork when
void OPENSSL_fork_prepare(void)
{
- GLOBAL_LOCK *lp;
-
- CRYPTO_THREAD_write_lock(glock_lock);
- for (lp = global_locks; lp != NULL; lp = lp->next)
- CRYPTO_THREAD_write_lock(lp->lock);
- CRYPTO_THREAD_unlock(glock_lock);
}
void OPENSSL_fork_parent(void)
{
- unlock_all();
}
void OPENSSL_fork_child(void)
{
- unlock_all();
rand_fork();
}
#endif