diff options
-rw-r--r-- | src/or/circuitlist.c | 2 | ||||
-rw-r--r-- | src/or/config.c | 1 | ||||
-rw-r--r-- | src/or/or.h | 14 | ||||
-rw-r--r-- | src/or/rendservice.c | 14 |
4 files changed, 20 insertions, 11 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index cf5440156..0051d46df 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -389,6 +389,8 @@ circuit_free(circuit_t *circ) tor_free(ocirc->build_state); circuit_free_cpath(ocirc->cpath); + if (ocirc->intro_key) + crypto_free_pk_env(ocirc->intro_key); } else { or_circuit_t *ocirc = TO_OR_CIRCUIT(circ); diff --git a/src/or/config.c b/src/or/config.c index f2e8b7b3d..b891cda42 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -192,6 +192,7 @@ static config_var_t _option_vars[] = { VAR("HiddenServiceNodes", LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceOptions",LINELIST_V, RendConfigLines, NULL), VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL), + /*DOCDOC in tor manpage*/ VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL), V(HSAuthoritativeDir, BOOL, "0"), V(HSAuthorityRecordStats, BOOL, "0"), diff --git a/src/or/or.h b/src/or/or.h index f4513d37b..512f90c32 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1763,12 +1763,6 @@ typedef struct origin_circuit_t { */ crypt_path_t *cpath; - /** Stores the rendezvous descriptor version if purpose is S_* to - * distinguish introduction and rendezvous points belonging to the same - * rendezvous service ID, but different descriptor versions. - */ - uint8_t rend_desc_version; - /** The rend_pk_digest field holds a hash of location-hidden service's * PK if purpose is S_ESTABLISH_INTRO or S_RENDEZVOUSING. */ @@ -1786,6 +1780,14 @@ typedef struct origin_circuit_t { */ char rend_query[REND_SERVICE_ID_LEN+1]; + /** Stores the rendezvous descriptor version if purpose is S_*. Used to + * distinguish introduction and rendezvous points belonging to the same + * rendezvous service ID, but different descriptor versions. + * XXXX020 I believe this is a bitmap, but the doc doesn't say so. If so, + * why? A circuit can't be using two different rendezvous decriptors. -NM + */ + uint8_t rend_desc_version; + /* The intro key replaces the hidden service's public key if purpose is * S_ESTABLISH_INTRO or S_INTRO, provided that no unversioned rendezvous * descriptor is used. */ diff --git a/src/or/rendservice.c b/src/or/rendservice.c index e9e4a3e13..d1b1932f0 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -56,11 +56,14 @@ typedef struct rend_service_t { time_t intro_period_started; int n_intro_circuits_launched; /**< count of intro circuits we have * established in this period. */ + /* DOCDOC undocumented versions */ rend_service_descriptor_t *desc; time_t desc_is_dirty; time_t next_upload_time; + /* XXXX020 A service never actually has both descriptor versions; perhaps + * this should be an int rather than in intmax. */ int descriptor_versions; /**< bitmask of rendezvous descriptor versions - * that will be published. */ + * that will be published. "0" means "default." */ } rend_service_t; /** A list of rend_service_t's for services run on this OP. @@ -454,9 +457,9 @@ rend_service_load_keys(void) return 0; } -/** Return the service whose public key has a digest of <b>digest</b> - * and which publishes descriptors of the given <b>versions</b> bitmask. - * Return NULL if no such service exists. +/** Return the service whose public key has a digest of <b>digest</b> and + * which publishes exactly the descriptor of the given <b>versions</b> + * bitmask. Return NULL if no such service exists. */ static rend_service_t * rend_service_get_by_pk_digest_and_version(const char* digest, @@ -810,7 +813,8 @@ rend_service_launch_establish_intro(rend_service_t *service, if (!(service->descriptor_versions & 1)) { launched->intro_key = crypto_new_pk_env(); tor_assert(!crypto_pk_generate_key(launched->intro_key)); - strmap_set(service->intro_keys, nickname, launched->intro_key); + strmap_set(service->intro_keys, nickname, + crypto_pk_dup_key(launched->intro_key)); } if (launched->_base.state == CIRCUIT_STATE_OPEN) rend_service_intro_has_opened(launched); |