From 5a7ad1f08bfccbdad0f20920f9c284bba036fb70 Mon Sep 17 00:00:00 2001 From: Rich Salz Date: Sat, 20 Aug 2016 19:06:43 -0400 Subject: [PATCH 1/1] Move BIO index lock creation Reviewed-by: Richard Levitte --- crypto/bio/b_addr.c | 4 +--- crypto/bio/bio_err.c | 1 + crypto/bio/bio_lib.c | 2 +- crypto/bio/bio_meth.c | 16 ++++++++++++++-- include/openssl/bio.h | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/crypto/bio/b_addr.c b/crypto/bio/b_addr.c index 17ab3e4e83..f924e1029f 100644 --- a/crypto/bio/b_addr.c +++ b/crypto/bio/b_addr.c @@ -19,7 +19,6 @@ #include CRYPTO_RWLOCK *bio_lookup_lock; -extern CRYPTO_RWLOCK *bio_type_lock; static CRYPTO_ONCE bio_lookup_init = CRYPTO_ONCE_STATIC_INIT; /* @@ -606,8 +605,7 @@ static int addrinfo_wrap(int family, int socktype, DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init) { bio_lookup_lock = CRYPTO_THREAD_lock_new(); - bio_type_lock = CRYPTO_THREAD_lock_new(); - return bio_lookup_lock != NULL && bio_type_lock != NULL; + return bio_lookup_lock != NULL; } /*- diff --git a/crypto/bio/bio_err.c b/crypto/bio/bio_err.c index 8f88cb92e5..98c90d6e52 100644 --- a/crypto/bio/bio_err.c +++ b/crypto/bio/bio_err.c @@ -29,6 +29,7 @@ static ERR_STRING_DATA BIO_str_functs[] = { {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, + {ERR_FUNC(BIO_F_BIO_GET_NEW_INDEX), "BIO_get_new_index"}, {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, {ERR_FUNC(BIO_F_BIO_LISTEN), "BIO_listen"}, {ERR_FUNC(BIO_F_BIO_LOOKUP), "BIO_lookup"}, diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index 8a00103e2c..62392c3a52 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -594,7 +594,7 @@ void bio_cleanup(void) bio_sock_cleanup_int(); CRYPTO_THREAD_lock_free(bio_lookup_lock); bio_lookup_lock = NULL; +#endif CRYPTO_THREAD_lock_free(bio_type_lock); bio_type_lock = NULL; -#endif } diff --git a/crypto/bio/bio_meth.c b/crypto/bio/bio_meth.c index 7754b00394..c5f9f7e8e7 100644 --- a/crypto/bio/bio_meth.c +++ b/crypto/bio/bio_meth.c @@ -8,14 +8,26 @@ */ #include "bio_lcl.h" +#include -CRYPTO_RWLOCK *bio_type_lock; -static int bio_count = BIO_TYPE_START; +CRYPTO_RWLOCK *bio_type_lock = NULL; +static CRYPTO_ONCE bio_type_init = CRYPTO_ONCE_STATIC_INIT; + +DEFINE_RUN_ONCE_STATIC(do_bio_type_init) +{ + bio_type_lock = CRYPTO_THREAD_lock_new(); + return bio_type_lock != NULL; +} int BIO_get_new_index() { + static int bio_count = BIO_TYPE_START; int newval; + if (!RUN_ONCE(&bio_type_init, do_bio_type_init)) { + BIOerr(BIO_F_BIO_GET_NEW_INDEX, ERR_R_MALLOC_FAILURE); + return -1; + } if (!CRYPTO_atomic_add(&bio_count, 1, &newval, bio_type_lock)) return -1; return newval; diff --git a/include/openssl/bio.h b/include/openssl/bio.h index d733f4701c..31d41b43e5 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -779,6 +779,7 @@ int ERR_load_BIO_strings(void); # define BIO_F_BIO_CTRL 103 # define BIO_F_BIO_GETS 104 # define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_NEW_INDEX 102 # define BIO_F_BIO_GET_PORT 107 # define BIO_F_BIO_LISTEN 139 # define BIO_F_BIO_LOOKUP 135 -- 2.34.1