summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-03-30 10:15:35 -0400
committerNick Mathewson <nickm@torproject.org>2012-03-30 10:15:35 -0400
commit1da5223e893fd61ed171782809ed9a55eb3503c7 (patch)
treed47b668e2046c48aa5bc846497faec95656b030d
parent545cb5f34ea5eba4209650833634611160ab7389 (diff)
parent491ffa540fda6a9cd8d75aad7d20945a3ae1df65 (diff)
downloadtor-1da5223e893fd61ed171782809ed9a55eb3503c7.tar.gz
tor-1da5223e893fd61ed171782809ed9a55eb3503c7.zip
Merge branch 'bug5527'
-rw-r--r--src/or/connection_or.c7
-rw-r--r--src/or/dirserv.c55
-rw-r--r--src/or/dirserv.h3
3 files changed, 28 insertions, 37 deletions
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 30d92b2728..0d3f9d87f2 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -1453,7 +1453,6 @@ int
connection_or_client_learned_peer_id(or_connection_t *conn,
const uint8_t *peer_id)
{
- int as_expected = 1;
const or_options_t *options = get_options();
int severity = server_mode(options) ? LOG_PROTOCOL_WARN : LOG_WARN;
@@ -1492,14 +1491,12 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
control_event_bootstrap_problem(
"Unexpected identity in router certificate",
END_OR_CONN_REASON_OR_IDENTITY);
- as_expected = 0;
+ return -1;
}
if (authdir_mode_tests_reachability(options)) {
dirserv_orconn_tls_done(conn->_base.address, conn->_base.port,
- (const char*)peer_id, as_expected);
+ (const char*)peer_id);
}
- if (!as_expected)
- return -1;
return 0;
}
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index a7bbe983c0..11f235caf4 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -3264,46 +3264,41 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
* router listening at <b>address</b>:<b>or_port</b>, and has yielded
* a certificate with digest <b>digest_rcvd</b>.
*
- * Also, if as_advertised is 1, then inform the reachability checker
- * that we could get to this guy.
+ * Inform the reachability checker that we could get to this guy.
*/
void
dirserv_orconn_tls_done(const char *address,
uint16_t or_port,
- const char *digest_rcvd,
- int as_advertised)
+ const char *digest_rcvd)
{
- routerlist_t *rl = router_get_routerlist();
+ routerinfo_t *ri;
time_t now = time(NULL);
- int bridge_auth = authdir_mode_bridge(get_options());
tor_assert(address);
tor_assert(digest_rcvd);
- /* XXX023 Doing a loop like this is stupid. We should just look up the
- * router by digest_rcvd, and see if address, orport, and as_advertised
- * match up. -NM */
- SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) {
- if (!strcasecmp(address, ri->address) && or_port == ri->or_port &&
- as_advertised &&
- fast_memeq(ri->cache_info.identity_digest, digest_rcvd, DIGEST_LEN)) {
- /* correct digest. mark this router reachable! */
- if (!bridge_auth || ri->purpose == ROUTER_PURPOSE_BRIDGE) {
- tor_addr_t addr, *addrp=NULL;
- log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
- router_describe(ri),
- address, ri->or_port);
- if (tor_addr_parse(&addr, ri->address) != -1)
- addrp = &addr;
- else
- log_warn(LD_BUG, "Couldn't parse IP address \"%s\"", ri->address);
- rep_hist_note_router_reachable(digest_rcvd, addrp, or_port, now);
- ri->last_reachable = now;
- }
+ ri = router_get_mutable_by_digest(digest_rcvd);
+
+ if (ri == NULL)
+ return;
+
+ if (!strcasecmp(address, ri->address) && or_port == ri->or_port) {
+ /* Found the right router. */
+ if (!authdir_mode_bridge(get_options()) ||
+ ri->purpose == ROUTER_PURPOSE_BRIDGE) {
+ /* This is a bridge or we're not a bridge authorititative --
+ mark it as reachable. */
+ tor_addr_t addr, *addrp=NULL;
+ log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
+ router_describe(ri),
+ address, ri->or_port);
+ if (tor_addr_parse(&addr, ri->address) != -1)
+ addrp = &addr;
+ else
+ log_warn(LD_BUG, "Couldn't parse IP address \"%s\"", ri->address);
+ rep_hist_note_router_reachable(digest_rcvd, addrp, or_port, now);
+ ri->last_reachable = now;
}
- } SMARTLIST_FOREACH_END(ri);
- /* FFFF Maybe we should reinstate the code that dumps routers with the same
- * addr/port but with nonmatching keys, but instead of dumping, we should
- * skip testing. */
+ }
}
/** Called when we, as an authority, receive a new router descriptor either as
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index 6a86b944ea..fc48e489e8 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -108,8 +108,7 @@ int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
const char **msg);
void dirserv_orconn_tls_done(const char *address,
uint16_t or_port,
- const char *digest_rcvd,
- int as_advertised);
+ const char *digest_rcvd);
int dirserv_should_launch_reachability_test(const routerinfo_t *ri,
const routerinfo_t *ri_old);
void dirserv_single_reachability_test(time_t now, routerinfo_t *router);