Move BIO index lock creation
authorRich Salz <rsalz@openssl.org>
Sat, 20 Aug 2016 23:06:43 +0000 (19:06 -0400)
committerRich Salz <rsalz@openssl.org>
Sun, 21 Aug 2016 18:18:09 +0000 (14:18 -0400)
Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/bio/b_addr.c
crypto/bio/bio_err.c
crypto/bio/bio_lib.c
crypto/bio/bio_meth.c
include/openssl/bio.h

index 17ab3e4e83e146b468c1b729df351316e6d31541..f924e1029f80331d5b32124b85dcaeb4e6c9e059 100644 (file)
@@ -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;
 }
 
 /*-
index 8f88cb92e521bde193c6d65f85618d9087069721..98c90d6e524f571780a59d957250c002d88c8c18 100644 (file)
@@ -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"},
index 8a00103e2c49a706c45825833cfed589c8135380..62392c3a52157f7e2b562c9d54ca35e4de689d71 100644 (file)
@@ -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
 }
index 7754b003947eab62878593b050a31c9b64e6f81d..c5f9f7e8e75f23531c6e93a5f9b540aa2603754b 100644 (file)
@@ -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;
index d733f4701cc444d2dd6669049fea9c4dfb6a41af..31d41b43e50b9bb49f9dfeb6c5f6adb6fc8206ca 100644 (file)
@@ -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