/** Macro: is k a valid RSA private key? */
#define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p)
+#ifdef TOR_IS_MULTITHREADED
+static tor_mutex_t **_openssl_mutexes = NULL;
+static int _n_openssl_mutexes = -1;
+#endif
+
struct crypto_pk_env_t
{
int refs; /* reference counting so we don't have to copy keys */
int crypto_global_cleanup()
{
ERR_free_strings();
+#ifdef TOR_IS_MULTITHREADED
+ if (_n_openssl_mutexes) {
+ int i;
+ for (i=0;i<_n_openssl_mutexes;++i) {
+ tor_mutex_free(_openssl_mutexes[i]);
+ }
+ tor_free(_openssl_mutexes);
+ _n_openssl_mutexes = 0;
+ }
+#endif
return 0;
}
}
#ifdef TOR_IS_MULTITHREADED
-static tor_mutex_t **_openssl_mutexes = NULL;
static void
_openssl_locking_cb(int mode, int n, const char *file, int line)
{
setup_openssl_threading(void) {
int i;
int n = CRYPTO_num_locks();
+ _n_openssl_mutexes = n;
_openssl_mutexes = tor_malloc(n*sizeof(tor_mutex_t *));
- for (i=0; i <n; ++i)
+ for (i=0; i < n; ++i)
_openssl_mutexes[i] = tor_mutex_new();
CRYPTO_set_locking_callback(_openssl_locking_cb);
CRYPTO_set_id_callback(tor_get_thread_id);
tor_free(the_directory_z);
the_directory_len = 0;
the_directory_z_len = 0;
+ tor_free(the_runningrouters);
+ tor_free(the_runningrouters_z);
+ the_runningrouters_len = 0;
+ the_runningrouters_z_len = 0;
tor_free(cached_directory.dir);
tor_free(cached_directory.dir_z);
tor_free(cached_runningrouters.dir);