Some locks were not being properly cleaned up during close down.
Reviewed-by: Richard Levitte <levitte@openssl.org>
#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;
/*
return ret;
}
+
#endif /* OPENSSL_NO_SOCK */
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);
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
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
+}
#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>
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)
*
*/
-#include "internal/cryptlib.h"
+#include "internal/cryptlib_int.h"
#include "internal/threads.h"
#include <openssl/lhash.h>
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;
}
/*
};
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
"crypto_cleanup_all_ex_data_int()\n");
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:
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;
}
long (*callback_ctrl) (BIO *, int, bio_info_cb *);
};
-void bio_sock_cleanup_int(void);
+void bio_cleanup(void);
# define INTERNAL_ERR_H
void err_free_strings_int(void);
+void err_cleanup(void);
#endif