From e05414d2411a5354dc43bde3a791938697a9799b Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 6 Sep 2017 16:26:47 -0400 Subject: [PATCH] Fix several places where md-using relays would get wrong behavior. This patch replaces a few calls to router_get_by_id_digest ("do we have a routerinfo?") with connection_or_digest_is_known_relay ("do we know this relay to be in the consensus, or have been there some time recently?"). Found while doing the 21585 audit; fixes bug 23533. Bugfix on 0.3.0.1-alpha. --- changes/bug23533 | 4 ++++ src/or/channel.c | 2 +- src/or/channeltls.c | 2 +- src/or/rephist.c | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 changes/bug23533 diff --git a/changes/bug23533 b/changes/bug23533 new file mode 100644 index 000000000..b5bfdc0ce --- /dev/null +++ b/changes/bug23533 @@ -0,0 +1,4 @@ + o Minor bugfixes (relay): + - Inform the geoip and rephist modules about all requests, even + on relays that are only fetching microdescriptors. Fixes a bug related + to 21585; bugfix on 0.3.0.1-alpha. diff --git a/src/or/channel.c b/src/or/channel.c index 17b2191b7..2970b9679 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -2696,7 +2696,7 @@ channel_do_open_actions(channel_t *chan) router_set_status(chan->identity_digest, 1); } else { /* only report it to the geoip module if it's not a known router */ - if (!router_get_by_id_digest(chan->identity_digest)) { + if (!connection_or_digest_is_known_relay(chan->identity_digest)) { if (channel_get_addr_if_possible(chan, &remote_addr)) { char *transport_name = NULL; if (chan->get_transport_name(chan, &transport_name) < 0) diff --git a/src/or/channeltls.c b/src/or/channeltls.c index f44e4fc8e..c6a0bb21e 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -1823,7 +1823,7 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) /** Warn when we get a netinfo skew with at least this value. */ #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && - router_get_by_id_digest(chan->conn->identity_digest)) { + connection_or_digest_is_known_relay(chan->conn->identity_digest)) { int trusted = router_digest_is_trusted_dir(chan->conn->identity_digest); clock_skew_warning(TO_CONN(chan->conn), apparent_skew, trusted, LD_GENERAL, "NETINFO cell", "OR"); diff --git a/src/or/rephist.c b/src/or/rephist.c index 72a5cc5a9..6a589379b 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -947,9 +947,9 @@ rep_hist_record_mtbf_data(time_t now, int missing_means_down) base16_encode(dbuf, sizeof(dbuf), digest, DIGEST_LEN); if (missing_means_down && hist->start_of_run && - !router_get_by_id_digest(digest)) { + !connection_or_digest_is_known_relay(digest)) { /* We think this relay is running, but it's not listed in our - * routerlist. Somehow it fell out without telling us it went + * consensus. Somehow it fell out without telling us it went * down. Complain and also correct it. */ log_info(LD_HIST, "Relay '%s' is listed as up in rephist, but it's not in "