[openssl-commits] [openssl] master update

Matt Caswell matt at openssl.org
Thu Apr 14 12:22:33 UTC 2016


The branch master has been updated
       via  ff2344052bfa0132260ee3154962a2552f3d95f5 (commit)
      from  085b3860651e2ff55e28f8a28a1f66b1a3fe538f (commit)


- Log -----------------------------------------------------------------
commit ff2344052bfa0132260ee3154962a2552f3d95f5
Author: Matt Caswell <matt at openssl.org>
Date:   Fri Mar 11 21:53:18 2016 +0000

    Ensure all locks are properly cleaned up
    
    Some locks were not being properly cleaned up during close down.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>

-----------------------------------------------------------------------

Summary of changes:
 crypto/bio/b_addr.c                    |  3 ++-
 crypto/bio/bio_lcl.h                   |  4 ++++
 crypto/bio/bio_lib.c                   | 10 ++++++++++
 crypto/err/err.c                       |  9 +++++++--
 crypto/ex_data.c                       | 10 +++++++---
 crypto/include/internal/cryptlib_int.h |  2 ++
 crypto/init.c                          | 10 +++++++---
 include/internal/bio.h                 |  2 +-
 include/internal/err.h                 |  1 +
 9 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/crypto/bio/b_addr.c b/crypto/bio/b_addr.c
index ed4c139..eed40bf 100644
--- a/crypto/bio/b_addr.c
+++ b/crypto/bio/b_addr.c
@@ -62,7 +62,7 @@
 #include <openssl/buffer.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;
 
 /*
@@ -891,4 +891,5 @@ int BIO_lookup(const char *host, const char *service,
 
     return ret;
 }
+
 #endif /* OPENSSL_NO_SOCK */
diff --git a/crypto/bio/bio_lcl.h b/crypto/bio/bio_lcl.h
index 7f3b222..52c9e79 100644
--- a/crypto/bio/bio_lcl.h
+++ b/crypto/bio/bio_lcl.h
@@ -127,6 +127,8 @@ struct bio_st {
 typedef unsigned int socklen_t;
 # endif
 
+extern CRYPTO_RWLOCK *bio_lookup_lock;
+
 int BIO_ADDR_make(BIO_ADDR *ap, const struct sockaddr *sa);
 const struct sockaddr *BIO_ADDR_sockaddr(const 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);
 #endif
 
+void bio_sock_cleanup_int(void);
+
 #if BIO_FLAGS_UPLINK==0
 /* Shortcut UPLINK calls on most platforms... */
 # define UP_stdin        stdin
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c
index ac98cf2..0258694 100644
--- a/crypto/bio/bio_lib.c
+++ b/crypto/bio/bio_lib.c
@@ -644,3 +644,13 @@ uint64_t BIO_number_written(BIO *bio)
         return bio->num_write;
     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
+}
diff --git a/crypto/err/err.c b/crypto/err/err.c
index 3ee4e86..aff3ae5 100644
--- a/crypto/err/err.c
+++ b/crypto/err/err.c
@@ -113,6 +113,7 @@
 #include <string.h>
 #include <internal/cryptlib_int.h>
 #include <internal/threads.h>
+#include <internal/err.h>
 #include <openssl/lhash.h>
 #include <openssl/crypto.h>
 #include <openssl/buffer.h>
@@ -389,9 +390,13 @@ static void ERR_STATE_free(ERR_STATE *s)
 
 static void do_err_strings_init(void)
 {
-    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
     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)
diff --git a/crypto/ex_data.c b/crypto/ex_data.c
index 44dc46b..c607f87 100644
--- a/crypto/ex_data.c
+++ b/crypto/ex_data.c
@@ -108,7 +108,7 @@
  *
  */
 
-#include "internal/cryptlib.h"
+#include "internal/cryptlib_int.h"
 #include "internal/threads.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)
 {
-    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
     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;
 }
 
 /*
diff --git a/crypto/include/internal/cryptlib_int.h b/crypto/include/internal/cryptlib_int.h
index ae30842..fd68522 100644
--- a/crypto/include/internal/cryptlib_int.h
+++ b/crypto/include/internal/cryptlib_int.h
@@ -65,6 +65,8 @@ struct thread_local_inits_st {
 };
 
 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
  * are those ommitted from crypto.h because they are "reserverd for internal
diff --git a/crypto/init.c b/crypto/init.c
index f44e3a8..48f74c4 100644
--- a/crypto/init.c
+++ b/crypto/init.c
@@ -468,9 +468,13 @@ void OPENSSL_cleanup(void)
     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
                     "bio_sock_cleanup_int()\n");
     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
+                    "bio_cleanup()\n");
+    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
                     "evp_cleanup_int()\n");
     fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
                     "obj_cleanup_int()\n");
+    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
+                    "err_cleanup()\n");
 #endif
     /*
      * Note that cleanup order is important:
@@ -489,11 +493,11 @@ void OPENSSL_cleanup(void)
     engine_cleanup_int();
 #endif
     crypto_cleanup_all_ex_data_int();
-#ifndef OPENSSL_NO_SOCK
-    bio_sock_cleanup_int();
-#endif
+    bio_cleanup();
     evp_cleanup_int();
     obj_cleanup_int();
+    err_cleanup();
+
     base_inited = 0;
 }
 
diff --git a/include/internal/bio.h b/include/internal/bio.h
index e62580b..ec9dff6 100644
--- a/include/internal/bio.h
+++ b/include/internal/bio.h
@@ -67,4 +67,4 @@ struct bio_method_st {
     long (*callback_ctrl) (BIO *, int, bio_info_cb *);
 };
 
-void bio_sock_cleanup_int(void);
+void bio_cleanup(void);
diff --git a/include/internal/err.h b/include/internal/err.h
index de2180b..415f578 100644
--- a/include/internal/err.h
+++ b/include/internal/err.h
@@ -59,5 +59,6 @@
 # define INTERNAL_ERR_H
 
 void err_free_strings_int(void);
+void err_cleanup(void);
 
 #endif


More information about the openssl-commits mailing list