]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix a few more instances of memory not freed on exit (found by weasel).
authorNick Mathewson <nickm@torproject.org>
Wed, 23 Mar 2005 06:20:50 +0000 (06:20 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 23 Mar 2005 06:20:50 +0000 (06:20 +0000)
svn:r3830

src/common/crypto.c
src/or/dirserv.c

index f851903c408bf3cfb9935eee722f4bb0169e53ea..c88be4b829d66095b60ef2fedb9063ee84b97a71 100644 (file)
@@ -79,6 +79,11 @@ const char crypto_c_id[] = "$Id$";
 /** 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 */
@@ -170,6 +175,16 @@ int crypto_global_init()
 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;
 }
 
@@ -1631,7 +1646,6 @@ secret_to_key(char *key_out, size_t key_out_len, const char *secret,
 }
 
 #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)
 {
@@ -1644,8 +1658,9 @@ static int
 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);
index 3df96e14f52a51a01a0c094ed4b902dea3194d8b..5f6b314bbc5a6132b765413ff43e624e1c9cc398 100644 (file)
@@ -990,6 +990,10 @@ dirserv_free_all(void)
   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);