Commit 177d5102 authored by Nick Mathewson's avatar Nick Mathewson 🦀
Browse files

r17503@catbus: nickm | 2008-01-07 14:15:30 -0500

 Change set_current_consensus interface to take a flags variable.  Do not try to fetch certificates until after we have tried loading the fallback consensus.  Should fix bug 583.


svn:r13058
parent a62ab48d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ Changes in version 0.2.0.16-alpha - 2008-01-??
      anymore, and we try to upload a hidden service descriptor.
    - Stop leaking one cert per TLS context.  Fixes bug 582.  Bugfix
      on 0.2.0.15-alpha.
    - Do not try to download missing certificates until we have tried
      to check our fallback consensus.  Fixes bug 583.

  o Minor features (controller):
    - Get NS events working again.  (Patch from tup)
+1 −1
Original line number Diff line number Diff line
@@ -1483,7 +1483,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
    }
    log_info(LD_DIR,"Received consensus directory (size %d) from server "
             "'%s:%d'",(int) body_len, conn->_base.address, conn->_base.port);
    if ((r=networkstatus_set_current_consensus(body, 0, 0))<0) {
    if ((r=networkstatus_set_current_consensus(body, 0))<0) {
      log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR,
             "Unable to load consensus directory downloaded from "
             "server '%s:%d'", conn->_base.address, conn->_base.port);
+1 −1
Original line number Diff line number Diff line
@@ -1850,7 +1850,7 @@ dirvote_publish_consensus(void)
    return -1;
  }

  if (networkstatus_set_current_consensus(pending_consensus_body, 0, 0))
  if (networkstatus_set_current_consensus(pending_consensus_body, 0))
    log_warn(LD_DIR, "Error publishing consensus");
  else
    log_notice(LD_DIR, "Consensus published.");
+18 −8
Original line number Diff line number Diff line
@@ -163,13 +163,14 @@ router_reload_consensus_networkstatus(void)
  char *s;
  struct stat st;
  or_options_t *options = get_options();
  const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS;

  /* XXXX020 Suppress warnings if cached consensus is bad. */

  filename = get_datadir_fname("cached-consensus");
  s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL);
  if (s) {
    if (networkstatus_set_current_consensus(s, 1, 0)) {
    if (networkstatus_set_current_consensus(s, flags)) {
      log_warn(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
               filename);
    }
@@ -180,7 +181,8 @@ router_reload_consensus_networkstatus(void)
  filename = get_datadir_fname("unverified-consensus");
  s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL);
  if (s) {
    if (networkstatus_set_current_consensus(s, 1, 1)) {
    if (networkstatus_set_current_consensus(s,
                                     flags|NSSET_WAS_WAITING_FOR_CERTS)) {
      log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
               filename);
    }
@@ -194,7 +196,7 @@ router_reload_consensus_networkstatus(void)
    s = read_file_to_str(options->FallbackNetworkstatusFile,
                         RFTS_IGNORE_MISSING, NULL);
    if (s) {
      if (networkstatus_set_current_consensus(s, 1, 1)) {
      if (networkstatus_set_current_consensus(s, flags)) {
        log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
                 options->FallbackNetworkstatusFile);
      } else {
@@ -212,6 +214,8 @@ router_reload_consensus_networkstatus(void)
      unnamed_server_map = strmap_new();
  }

  update_certificate_downloads(time(NULL));

  routers_update_all_from_networkstatus(time(NULL), 3);

  return 0;
@@ -1323,13 +1327,17 @@ networkstatus_copy_old_consensus_info(networkstatus_vote_t *new_c,
 * user, and -2 for more serious problems.
 */
int
networkstatus_set_current_consensus(const char *consensus, int from_cache,
                                    int was_waiting_for_certs)
networkstatus_set_current_consensus(const char *consensus, unsigned flags)


{
  networkstatus_vote_t *c;
  int r, result = -1;
  time_t now = time(NULL);
  char *unverified_fname = NULL, *consensus_fname = NULL;
  const unsigned from_cache = flags & NSSET_FROM_CACHE;
  const unsigned was_waiting_for_certs = flags & NSSET_WAS_WAITING_FOR_CERTS;
  const unsigned dl_certs = !(flags & NSSET_DONT_DOWNLOAD_CERTS);

  /* Make sure it's parseable. */
  c = networkstatus_parse_vote_from_string(consensus, NULL, 0);
@@ -1380,6 +1388,7 @@ networkstatus_set_current_consensus(const char *consensus, int from_cache,
        if (!from_cache) {
          write_str_to_file(unverified_fname, consensus, 0);
        }
        if (dl_certs)
          authority_certs_fetch_missing(c, now);
        /* This case is not a success or a failure until we get the certs
         * or fail to get the certs. */
@@ -1405,7 +1414,7 @@ networkstatus_set_current_consensus(const char *consensus, int from_cache,
  }

  /* Are we missing any certificates at all? */
  if (r != 1)
  if (r != 1 && dl_certs)
    authority_certs_fetch_missing(c, now);

  if (control_event_is_interesting(EVENT_NS))
@@ -1486,7 +1495,8 @@ networkstatus_note_certs_arrived(void)
    if (networkstatus_check_consensus_signature(
                                    consensus_waiting_for_certs, 0)>=0) {
      if (!networkstatus_set_current_consensus(
                                 consensus_waiting_for_certs_body, 0, 1)) {
                                 consensus_waiting_for_certs_body,
                                 NSSET_WAS_WAITING_FOR_CERTS)) {
        tor_free(consensus_waiting_for_certs_body);
      }
    }
+4 −2
Original line number Diff line number Diff line
@@ -3366,8 +3366,10 @@ networkstatus_v2_t *networkstatus_v2_get_by_digest(const char *digest);
networkstatus_vote_t *networkstatus_get_latest_consensus(void);
networkstatus_vote_t *networkstatus_get_live_consensus(time_t now);
networkstatus_vote_t *networkstatus_get_reasonably_live_consensus(time_t now);
int networkstatus_set_current_consensus(const char *consensus, int from_cache,
                                        int was_waiting_for_certs);
#define NSSET_FROM_CACHE 1
#define NSSET_WAS_WAITING_FOR_CERTS 2
#define NSSET_DONT_DOWNLOAD_CERTS 4
int networkstatus_set_current_consensus(const char *consensus, unsigned flags);
void networkstatus_note_certs_arrived(void);
void routers_update_all_from_networkstatus(time_t now, int dir_version);
void routerstatus_list_update_from_consensus_networkstatus(time_t now);