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:
Matt Caswell 2016-03-11 21:53:18 +00:00
parent 085b386065
commit ff2344052b
9 changed files with 41 additions and 10 deletions

View File

@ -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 */

View File

@ -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

View File

@ -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
}

View File

@ -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)

View File

@ -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;
} }
/* /*

View File

@ -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

View File

@ -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;
} }

View File

@ -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);

View File

@ -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