summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorRich Salz <rsalz@openssl.org>2016-08-20 19:06:43 -0400
committerRich Salz <rsalz@openssl.org>2016-08-21 14:18:09 -0400
commit5a7ad1f08bfccbdad0f20920f9c284bba036fb70 (patch)
tree2632f6f907b85cb583a52335ca9d5e47f9a24829 /crypto
parent6b1f413c3a8563a53e1b41d48d870c010541c7f5 (diff)
Move BIO index lock creation
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/bio/b_addr.c4
-rw-r--r--crypto/bio/bio_err.c1
-rw-r--r--crypto/bio/bio_lib.c2
-rw-r--r--crypto/bio/bio_meth.c16
4 files changed, 17 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 <ctype.h>
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 <internal/thread_once.h>
-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;