|
@@ -211,7 +211,8 @@ router_reload_consensus_networkstatus(void)
|
|
|
s = read_file_to_str(options->FallbackNetworkstatusFile,
|
|
|
RFTS_IGNORE_MISSING, NULL);
|
|
|
if (s) {
|
|
|
- if (networkstatus_set_current_consensus(s, flags)) {
|
|
|
+ if (networkstatus_set_current_consensus(s,
|
|
|
+ flags|NSSET_ACCEPT_OBSOLETE)) {
|
|
|
log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
|
|
|
options->FallbackNetworkstatusFile);
|
|
|
} else {
|
|
@@ -1371,6 +1372,8 @@ networkstatus_copy_old_consensus_info(networkstatus_t *new_c,
|
|
|
* cache. If flags & NSSET_WAS_WAITING_FOR_CERTS, this networkstatus was
|
|
|
* already received, but we were waiting for certificates on it. If flags &
|
|
|
* NSSET_DONT_DOWNLOAD_CERTS, do not launch certificate downloads as needed.
|
|
|
+ * If flags & NSSET_ACCEPT_OBSOLETE, then we should be willing to take this
|
|
|
+ * consensus, even if it comes from many days in the past.
|
|
|
*
|
|
|
* Return 0 on success, <0 on failure. On failure, caller should increment
|
|
|
* the failure count as appropriate.
|
|
@@ -1388,6 +1391,7 @@ networkstatus_set_current_consensus(const char *consensus, unsigned flags)
|
|
|
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);
|
|
|
+ const unsigned accept_obsolete = flags & NSSET_ACCEPT_OBSOLETE;
|
|
|
|
|
|
/* Make sure it's parseable. */
|
|
|
c = networkstatus_parse_vote_from_string(consensus, NULL, NS_TYPE_CONSENSUS);
|
|
@@ -1397,6 +1401,15 @@ networkstatus_set_current_consensus(const char *consensus, unsigned flags)
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
+ if (from_cache && !accept_obsolete &&
|
|
|
+ c->valid_until < now-OLD_ROUTER_DESC_MAX_AGE) {
|
|
|
+ /* XXX022 when we try to make fallbackconsensus work again, we should
|
|
|
+ * consider taking this out. Until then, believing obsolete consensuses
|
|
|
+ * is causing more harm than good. See also bug 887. */
|
|
|
+ log_info(LD_DIR, "Loaded an obsolete consensus. Discarding.");
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
if (current_consensus &&
|
|
|
!memcmp(c->networkstatus_digest, current_consensus->networkstatus_digest,
|
|
|
DIGEST_LEN)) {
|