mirror of https://github.com/openssl/openssl.git
Ensure all locks are properly cleaned up
Some locks were not being properly cleaned up during close down. Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
085b386065
commit
ff2344052b
|
@ -62,7 +62,7 @@
|
||||||
#include <openssl/buffer.h>
|
#include <openssl/buffer.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
static CRYPTO_RWLOCK *bio_lookup_lock;
|
CRYPTO_RWLOCK *bio_lookup_lock;
|
||||||
static CRYPTO_ONCE bio_lookup_init = CRYPTO_ONCE_STATIC_INIT;
|
static CRYPTO_ONCE bio_lookup_init = CRYPTO_ONCE_STATIC_INIT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -891,4 +891,5 @@ int BIO_lookup(const char *host, const char *service,
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* OPENSSL_NO_SOCK */
|
#endif /* OPENSSL_NO_SOCK */
|
||||||
|
|
|
@ -127,6 +127,8 @@ struct bio_st {
|
||||||
typedef unsigned int socklen_t;
|
typedef unsigned int socklen_t;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
extern CRYPTO_RWLOCK *bio_lookup_lock;
|
||||||
|
|
||||||
int BIO_ADDR_make(BIO_ADDR *ap, const struct sockaddr *sa);
|
int BIO_ADDR_make(BIO_ADDR *ap, const struct sockaddr *sa);
|
||||||
const struct sockaddr *BIO_ADDR_sockaddr(const BIO_ADDR *ap);
|
const struct sockaddr *BIO_ADDR_sockaddr(const BIO_ADDR *ap);
|
||||||
struct sockaddr *BIO_ADDR_sockaddr_noconst(BIO_ADDR *ap);
|
struct sockaddr *BIO_ADDR_sockaddr_noconst(BIO_ADDR *ap);
|
||||||
|
@ -135,6 +137,8 @@ socklen_t BIO_ADDRINFO_sockaddr_size(const BIO_ADDRINFO *bai);
|
||||||
const struct sockaddr *BIO_ADDRINFO_sockaddr(const BIO_ADDRINFO *bai);
|
const struct sockaddr *BIO_ADDRINFO_sockaddr(const BIO_ADDRINFO *bai);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void bio_sock_cleanup_int(void);
|
||||||
|
|
||||||
#if BIO_FLAGS_UPLINK==0
|
#if BIO_FLAGS_UPLINK==0
|
||||||
/* Shortcut UPLINK calls on most platforms... */
|
/* Shortcut UPLINK calls on most platforms... */
|
||||||
# define UP_stdin stdin
|
# define UP_stdin stdin
|
||||||
|
|
|
@ -644,3 +644,13 @@ uint64_t BIO_number_written(BIO *bio)
|
||||||
return bio->num_write;
|
return bio->num_write;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void bio_cleanup(void)
|
||||||
|
{
|
||||||
|
#ifndef OPENSSL_NO_SOCK
|
||||||
|
bio_sock_cleanup_int();
|
||||||
|
CRYPTO_THREAD_lock_free(bio_lookup_lock);
|
||||||
|
bio_lookup_lock = NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -113,6 +113,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <internal/cryptlib_int.h>
|
#include <internal/cryptlib_int.h>
|
||||||
#include <internal/threads.h>
|
#include <internal/threads.h>
|
||||||
|
#include <internal/err.h>
|
||||||
#include <openssl/lhash.h>
|
#include <openssl/lhash.h>
|
||||||
#include <openssl/crypto.h>
|
#include <openssl/crypto.h>
|
||||||
#include <openssl/buffer.h>
|
#include <openssl/buffer.h>
|
||||||
|
@ -389,9 +390,13 @@ static void ERR_STATE_free(ERR_STATE *s)
|
||||||
|
|
||||||
static void do_err_strings_init(void)
|
static void do_err_strings_init(void)
|
||||||
{
|
{
|
||||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
|
|
||||||
err_string_lock = CRYPTO_THREAD_lock_new();
|
err_string_lock = CRYPTO_THREAD_lock_new();
|
||||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
}
|
||||||
|
|
||||||
|
void err_cleanup(void)
|
||||||
|
{
|
||||||
|
CRYPTO_THREAD_lock_free(err_string_lock);
|
||||||
|
err_string_lock = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ERR_load_ERR_strings(void)
|
void ERR_load_ERR_strings(void)
|
||||||
|
|
|
@ -108,7 +108,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "internal/cryptlib.h"
|
#include "internal/cryptlib_int.h"
|
||||||
#include "internal/threads.h"
|
#include "internal/threads.h"
|
||||||
#include <openssl/lhash.h>
|
#include <openssl/lhash.h>
|
||||||
|
|
||||||
|
@ -139,9 +139,13 @@ static CRYPTO_ONCE ex_data_init = CRYPTO_ONCE_STATIC_INIT;
|
||||||
|
|
||||||
static void do_ex_data_init(void)
|
static void do_ex_data_init(void)
|
||||||
{
|
{
|
||||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
|
|
||||||
ex_data_lock = CRYPTO_THREAD_lock_new();
|
ex_data_lock = CRYPTO_THREAD_lock_new();
|
||||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
}
|
||||||
|
|
||||||
|
void ex_data_cleanup(void)
|
||||||
|
{
|
||||||
|
CRYPTO_THREAD_lock_free(ex_data_lock);
|
||||||
|
ex_data_lock = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -65,6 +65,8 @@ struct thread_local_inits_st {
|
||||||
};
|
};
|
||||||
|
|
||||||
int ossl_init_thread_start(uint64_t opts);
|
int ossl_init_thread_start(uint64_t opts);
|
||||||
|
void ex_data_cleanup(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below
|
* OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below
|
||||||
* are those ommitted from crypto.h because they are "reserverd for internal
|
* are those ommitted from crypto.h because they are "reserverd for internal
|
||||||
|
|
|
@ -467,10 +467,14 @@ void OPENSSL_cleanup(void)
|
||||||
"crypto_cleanup_all_ex_data_int()\n");
|
"crypto_cleanup_all_ex_data_int()\n");
|
||||||
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
||||||
"bio_sock_cleanup_int()\n");
|
"bio_sock_cleanup_int()\n");
|
||||||
|
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
||||||
|
"bio_cleanup()\n");
|
||||||
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
||||||
"evp_cleanup_int()\n");
|
"evp_cleanup_int()\n");
|
||||||
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
||||||
"obj_cleanup_int()\n");
|
"obj_cleanup_int()\n");
|
||||||
|
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
|
||||||
|
"err_cleanup()\n");
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* Note that cleanup order is important:
|
* Note that cleanup order is important:
|
||||||
|
@ -489,11 +493,11 @@ void OPENSSL_cleanup(void)
|
||||||
engine_cleanup_int();
|
engine_cleanup_int();
|
||||||
#endif
|
#endif
|
||||||
crypto_cleanup_all_ex_data_int();
|
crypto_cleanup_all_ex_data_int();
|
||||||
#ifndef OPENSSL_NO_SOCK
|
bio_cleanup();
|
||||||
bio_sock_cleanup_int();
|
|
||||||
#endif
|
|
||||||
evp_cleanup_int();
|
evp_cleanup_int();
|
||||||
obj_cleanup_int();
|
obj_cleanup_int();
|
||||||
|
err_cleanup();
|
||||||
|
|
||||||
base_inited = 0;
|
base_inited = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,4 +67,4 @@ struct bio_method_st {
|
||||||
long (*callback_ctrl) (BIO *, int, bio_info_cb *);
|
long (*callback_ctrl) (BIO *, int, bio_info_cb *);
|
||||||
};
|
};
|
||||||
|
|
||||||
void bio_sock_cleanup_int(void);
|
void bio_cleanup(void);
|
||||||
|
|
|
@ -59,5 +59,6 @@
|
||||||
# define INTERNAL_ERR_H
|
# define INTERNAL_ERR_H
|
||||||
|
|
||||||
void err_free_strings_int(void);
|
void err_free_strings_int(void);
|
||||||
|
void err_cleanup(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue