Browse Source

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.
Sebastian Hahn 15 years ago
parent
commit
213139f887
2 changed files with 2 additions and 1 deletions
  1. 1 0
      src/common/crypto.c
  2. 1 1
      src/or/router.c

+ 1 - 0
src/common/crypto.c

@@ -405,6 +405,7 @@ crypto_free_pk_env(crypto_pk_env_t *env)
 
 
   if (--env->refs > 0)
   if (--env->refs > 0)
     return;
     return;
+  tor_assert(env->refs == 0);
 
 
   if (env->key)
   if (env->key)
     RSA_free(env->key);
     RSA_free(env->key);

+ 1 - 1
src/or/router.c

@@ -573,7 +573,7 @@ init_keys(void)
    * otherwise, set the server identity key as our client identity
    * otherwise, set the server identity key as our client identity
    * key. */
    * key. */
   if (public_server_mode(options)) {
   if (public_server_mode(options)) {
-    set_client_identity_key(prkey); /* set above */
+    set_client_identity_key(crypto_pk_dup_key(prkey)); /* set above */
   } else {
   } else {
     if (!(prkey = crypto_new_pk_env()))
     if (!(prkey = crypto_new_pk_env()))
       return -1;
       return -1;