If we have a routerstatus but no routerinfo to name a router, use the routerstatus instead when generating circuit events. Also refactor a little.

svn:r19078
This commit is contained in:
Nick Mathewson 2009-03-18 19:30:30 +00:00
parent e591aafca4
commit a335b43a67
2 changed files with 16 additions and 8 deletions

View File

@ -13,6 +13,12 @@ Changes in version 0.2.1.14-??? - 2009-03-??
- Avoid double-free on list of successfully uploaded hidden
service discriptors. Fix for bug 948. Bugfix on 0.2.1.6-alpha.
o Minor features (controller):
- Try harder to look up nicknames for routers on a circuit when
generating circuit events with verbose nicknames. (Previously, we
would look in the router descriptors we had for nicknames, but not
in the consensus.) Partial fix for bug 941.
Changes in version 0.2.1.13-alpha - 2009-03-09
Tor 0.2.1.13-alpha includes another big pile of minor bugfixes and

View File

@ -133,39 +133,41 @@ circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names)
hop = circ->cpath;
do {
routerinfo_t *ri;
routerstatus_t *rs;
char *elt;
const char *id;
if (!hop)
break;
id = hop->extend_info->identity_digest;
if (!verbose && hop->state != CPATH_STATE_OPEN)
break;
if (!hop->extend_info)
break;
if (verbose_names) {
elt = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1);
if ((ri = router_get_by_digest(hop->extend_info->identity_digest))) {
if ((ri = router_get_by_digest(id))) {
router_get_verbose_nickname(elt, ri);
} else if ((rs = router_get_consensus_status_by_id(id))) {
routerstatus_get_verbose_nickname(elt, rs);
} else if (hop->extend_info->nickname &&
is_legal_nickname(hop->extend_info->nickname)) {
elt[0] = '$';
base16_encode(elt+1, HEX_DIGEST_LEN+1,
hop->extend_info->identity_digest, DIGEST_LEN);
base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN);
elt[HEX_DIGEST_LEN+1]= '~';
strlcpy(elt+HEX_DIGEST_LEN+2,
hop->extend_info->nickname, MAX_NICKNAME_LEN+1);
} else {
elt[0] = '$';
base16_encode(elt+1, HEX_DIGEST_LEN+1,
hop->extend_info->identity_digest, DIGEST_LEN);
base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN);
}
} else { /* ! verbose_names */
if ((ri = router_get_by_digest(hop->extend_info->identity_digest)) &&
if ((ri = router_get_by_digest(id)) &&
ri->is_named) {
elt = tor_strdup(hop->extend_info->nickname);
} else {
elt = tor_malloc(HEX_DIGEST_LEN+2);
elt[0] = '$';
base16_encode(elt+1, HEX_DIGEST_LEN+1,
hop->extend_info->identity_digest, DIGEST_LEN);
base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN);
}
}
tor_assert(elt);