Commit e05414d2 authored by Nick Mathewson's avatar Nick Mathewson 🐚
Browse files

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.
parent b440560b
Loading
Loading
Loading
Loading

changes/bug23533

0 → 100644
+4 −0
Original line number Diff line number Diff line
  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.
+1 −1
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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");
+2 −2
Original line number Diff line number Diff line
@@ -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 "