[tor-commits] [tor/release-0.2.1] Properly refcount client_identity_key

arma at torproject.org arma at torproject.org
Wed Oct 26 20:34:37 UTC 2011


commit 3a890b3b70d53ac864be682f50f07ba07b8f09ba
Author: Sebastian Hahn <sebastian at torproject.org>
Date:   Tue Oct 26 18:22:04 2010 +0200

    Properly refcount client_identity_key
    
    In a2bb0bf we started using a separate client identity key. When we are
    in "public server mode" (that means not a bridge) we will use the same
    key. Reusing the key without doing the proper refcounting leads to a
    segfault on cleanup during shutdown. Fix that.
    
    Also introduce an assert that triggers if our refcount falls below 0.
    That should never happen.
---
 src/common/crypto.c |    1 +
 src/or/router.c     |    2 +-
 2 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/common/crypto.c b/src/common/crypto.c
index c723c33..a444cf1 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -326,6 +326,7 @@ crypto_free_pk_env(crypto_pk_env_t *env)
 
   if (--env->refs > 0)
     return;
+  tor_assert(env->refs == 0);
 
   if (env->key)
     RSA_free(env->key);
diff --git a/src/or/router.c b/src/or/router.c
index 96aca88..c471599 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -559,7 +559,7 @@ init_keys(void)
    * otherwise, set the server identity key as our client identity
    * key. */
   if (public_server_mode(options)) {
-    set_client_identity_key(prkey); /* set above */
+    set_client_identity_key(crypto_pk_dup_key(prkey)); /* set above */
   } else {
     if (!(prkey = crypto_new_pk_env()))
       return -1;





More information about the tor-commits mailing list