Merge remote-tracking branch 'public/bug20103_028_v3' into maint-0.2.8

This commit is contained in:
Nick Mathewson 2016-09-20 19:30:24 -04:00
commit 9ebe202da0
2 changed files with 20 additions and 11 deletions

7
changes/bug20103 Normal file
View File

@ -0,0 +1,7 @@
o Major bug fixes (crash):
- Fix a complicated crash bug that could affect Tor clients
configured to use bridges when replacing a networkstatus consensus
in which one of their bridges was mentioned. OpenBSD users saw
more crashes here, but all platforms were potentially affected.
Fixes bug 20103; bugfix on 0.2.8.2-alpha.

View File

@ -1631,7 +1631,9 @@ networkstatus_set_current_consensus(const char *consensus,
if (r != 1 && dl_certs) if (r != 1 && dl_certs)
authority_certs_fetch_missing(c, now); authority_certs_fetch_missing(c, now);
if (flav == usable_consensus_flavor()) { const int is_usable_flavor = flav == usable_consensus_flavor();
if (is_usable_flavor) {
notify_control_networkstatus_changed(current_consensus, c); notify_control_networkstatus_changed(current_consensus, c);
} }
if (flav == FLAV_NS) { if (flav == FLAV_NS) {
@ -1674,20 +1676,12 @@ networkstatus_set_current_consensus(const char *consensus,
} }
} }
/* Reset the failure count only if this consensus is actually valid. */ if (is_usable_flavor) {
if (c->valid_after <= now && now <= c->valid_until) { nodelist_set_consensus(c);
download_status_reset(&consensus_dl_status[flav]);
} else {
if (!from_cache)
download_status_failed(&consensus_dl_status[flav], 0);
}
if (flav == usable_consensus_flavor()) {
/* XXXXNM Microdescs: needs a non-ns variant. ???? NM*/ /* XXXXNM Microdescs: needs a non-ns variant. ???? NM*/
update_consensus_networkstatus_fetch_time(now); update_consensus_networkstatus_fetch_time(now);
nodelist_set_consensus(current_consensus);
dirvote_recalculate_timing(options, now); dirvote_recalculate_timing(options, now);
routerstatus_list_update_named_server_map(); routerstatus_list_update_named_server_map();
@ -1711,6 +1705,14 @@ networkstatus_set_current_consensus(const char *consensus,
current_consensus); current_consensus);
} }
/* Reset the failure count only if this consensus is actually valid. */
if (c->valid_after <= now && now <= c->valid_until) {
download_status_reset(&consensus_dl_status[flav]);
} else {
if (!from_cache)
download_status_failed(&consensus_dl_status[flav], 0);
}
if (directory_caches_dir_info(options)) { if (directory_caches_dir_info(options)) {
dirserv_set_cached_consensus_networkstatus(consensus, dirserv_set_cached_consensus_networkstatus(consensus,
flavor, flavor,