| 
					
				 | 
			
			
				@@ -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)) { 
			 |