tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 1c39d969b99b7825a0e2f2db67efb0c0e19d7002
parent df312b3cf637d2c5487adc60ed541823bef56f06
Author: Nick Mathewson <nickm@torproject.org>
Date:   Wed, 31 Jan 2018 13:46:58 -0500

Merge remote-tracking branch 'dgoulet/bug24975_032_01' into maint-0.3.2

Diffstat:
Achanges/bug24975 | 6++++++
Msrc/or/networkstatus.c | 16++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/changes/bug24975 b/changes/bug24975 @@ -0,0 +1,6 @@ + o Major bugfixes (scheduler, consensus): + - A logic in the code was preventing the scheduler subystem to properly + make a decision based on the latest consensus when it arrives. This lead + to the scheduler failing to notice any consensus parameters that might + change from one consensus to another. Fixes bug 24975; bugfix on + 0.3.2.1-alpha. diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c @@ -1564,7 +1564,11 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c, smartlist_free(changed); } -/* Called when the consensus has changed from old_c to new_c. */ +/* Called when the consensus has changed from old_c to new_c. + * + * IMPORTANT: This is called _after_ the new consensus has been set in the + * global state so this is safe for anything getting the latest consensus from + * that state. */ static void notify_networkstatus_changed(const networkstatus_t *old_c, const networkstatus_t *new_c) @@ -1897,9 +1901,6 @@ networkstatus_set_current_consensus(const char *consensus, const int is_usable_flavor = flav == usable_consensus_flavor(); - if (is_usable_flavor) { - notify_networkstatus_changed(networkstatus_get_latest_consensus(), c); - } if (flav == FLAV_NS) { if (current_ns_consensus) { networkstatus_copy_old_consensus_info(c, current_ns_consensus); @@ -1922,6 +1923,13 @@ networkstatus_set_current_consensus(const char *consensus, free_consensus = 0; /* avoid free */ } + /* Called _after_ the consensus is set in its global variable so any + * functions called from this notification can safely get the latest + * consensus being the new one. */ + if (is_usable_flavor) { + notify_networkstatus_changed(networkstatus_get_latest_consensus(), c); + } + waiting = &consensus_waiting_for_certs[flav]; if (waiting->consensus && waiting->consensus->valid_after <= c->valid_after) {