Audit all of the "is the network turned off" checks.

DisableNetwork is a subset of net_is_disabled(), which is (now) a
subset of should_delay_dir_fetches().

Some of these changes are redundant with others higher or lower in
the call stack.  The ones that I think are behavior-relevant are
listed in the changes file.  I've also added comments in a few
places where the behavior is subtle.

Fixes bug 12062; bugfix on various versions.
This commit is contained in:
Nick Mathewson 2017-09-21 14:34:36 -04:00
parent 6045bdd4a0
commit 0c6eabf088
6 changed files with 42 additions and 9 deletions

16
changes/bug12062 Normal file
View File

@ -0,0 +1,16 @@
o Minor bugfixes:
- When hibernating, do not attempt to launch DNS checks. Fixes a
case of bug 12062; bugfix on 0.1.2.2-alpha.
- Resolve several bugs related to descriptor fetching on bridge
clients with bandwidth accounting enabled. (This combination is
not recommended!) Fixes a case of bug 12062; bugfix on
0.2.0.3-alpha.
- When hibernating, do not try to upload or download
descriptors. Fixes a case of bug 12062; bugfix on 0.0.9pre5.
- Do not attempt to launch self-reachability tests when entering
hibernation. Fixes a base of bug 12062; bugfix on 0.0.9pre5.

View File

@ -1746,7 +1746,11 @@ connection_connect_sockaddr,(connection_t *conn,
if (get_options()->DisableNetwork) { if (get_options()->DisableNetwork) {
/* We should never even try to connect anyplace if DisableNetwork is set. /* We should never even try to connect anyplace if DisableNetwork is set.
* Warn if we do, and refuse to make the connection. */ * Warn if we do, and refuse to make the connection.
*
* We only check DisableNetwork here, not we_are_hibernating(), since
* we'll still try to fulfill client requests sometimes in the latter case
* (if it is soft hibernation) */
static ratelim_t disablenet_violated = RATELIM_INIT(30*60); static ratelim_t disablenet_violated = RATELIM_INIT(30*60);
*socket_error = SOCK_ERRNO(ENETUNREACH); *socket_error = SOCK_ERRNO(ENETUNREACH);
log_fn_ratelim(&disablenet_violated, LOG_WARN, LD_BUG, log_fn_ratelim(&disablenet_violated, LOG_WARN, LD_BUG,

View File

@ -1648,7 +1648,7 @@ launch_resolve,(cached_resolve_t *resolve))
tor_addr_t a; tor_addr_t a;
int r; int r;
if (get_options()->DisableNetwork) if (net_is_disabled())
return -1; return -1;
/* What? Nameservers not configured? Sounds like a bug. */ /* What? Nameservers not configured? Sounds like a bug. */
@ -1883,7 +1883,7 @@ launch_test_addresses(evutil_socket_t fd, short event, void *args)
(void)event; (void)event;
(void)args; (void)args;
if (options->DisableNetwork) if (net_is_disabled())
return; return;
log_info(LD_EXIT, "Launching checks to see whether our nameservers like to " log_info(LD_EXIT, "Launching checks to see whether our nameservers like to "

View File

@ -1405,7 +1405,9 @@ run_scheduled_events(time_t now)
/* Maybe enough time elapsed for us to reconsider a circuit. */ /* Maybe enough time elapsed for us to reconsider a circuit. */
circuit_upgrade_circuits_from_guard_wait(); circuit_upgrade_circuits_from_guard_wait();
if (options->UseBridges && !options->DisableNetwork) { if (options->UseBridges && !net_is_disabled()) {
/* Note: this check uses net_is_disabled(), not should_delay_dir_fetches()
* -- the latter is only for fetching consensus-derived directory info. */
fetch_bridge_descriptors(options, now); fetch_bridge_descriptors(options, now);
} }
@ -1511,7 +1513,7 @@ rotate_onion_key_callback(time_t now, const or_options_t *options)
if (router_rebuild_descriptor(1)<0) { if (router_rebuild_descriptor(1)<0) {
log_info(LD_CONFIG, "Couldn't rebuild router descriptor"); log_info(LD_CONFIG, "Couldn't rebuild router descriptor");
} }
if (advertised_server_mode() && !options->DisableNetwork) if (advertised_server_mode() && !net_is_disabled())
router_upload_dir_desc_to_dirservers(0); router_upload_dir_desc_to_dirservers(0);
return ONION_KEY_CONSENSUS_CHECK_INTERVAL; return ONION_KEY_CONSENSUS_CHECK_INTERVAL;
} }
@ -1877,9 +1879,11 @@ check_descriptor_callback(time_t now, const or_options_t *options)
* address has changed. */ * address has changed. */
#define CHECK_DESCRIPTOR_INTERVAL (60) #define CHECK_DESCRIPTOR_INTERVAL (60)
(void)options;
/* 2b. Once per minute, regenerate and upload the descriptor if the old /* 2b. Once per minute, regenerate and upload the descriptor if the old
* one is inaccurate. */ * one is inaccurate. */
if (!options->DisableNetwork) { if (!net_is_disabled()) {
check_descriptor_bandwidth_changed(now); check_descriptor_bandwidth_changed(now);
check_descriptor_ipaddress_changed(now); check_descriptor_ipaddress_changed(now);
mark_my_descriptor_dirty_if_too_old(now); mark_my_descriptor_dirty_if_too_old(now);
@ -1911,7 +1915,7 @@ check_for_reachability_bw_callback(time_t now, const or_options_t *options)
* 20 minutes of our uptime. */ * 20 minutes of our uptime. */
if (server_mode(options) && if (server_mode(options) &&
(have_completed_a_circuit() || !any_predicted_circuits(now)) && (have_completed_a_circuit() || !any_predicted_circuits(now)) &&
!we_are_hibernating()) { !net_is_disabled()) {
if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) {
consider_testing_reachability(1, dirport_reachability_count==0); consider_testing_reachability(1, dirport_reachability_count==0);
if (++dirport_reachability_count > 5) if (++dirport_reachability_count > 5)
@ -2405,7 +2409,7 @@ do_hup(void)
/* retry appropriate downloads */ /* retry appropriate downloads */
router_reset_status_download_failures(); router_reset_status_download_failures();
router_reset_descriptor_download_failures(); router_reset_descriptor_download_failures();
if (!options->DisableNetwork) if (!net_is_disabled())
update_networkstatus_downloads(time(NULL)); update_networkstatus_downloads(time(NULL));
/* We'll retry routerstatus downloads in about 10 seconds; no need to /* We'll retry routerstatus downloads in about 10 seconds; no need to

View File

@ -52,6 +52,7 @@
#include "dirserv.h" #include "dirserv.h"
#include "dirvote.h" #include "dirvote.h"
#include "entrynodes.h" #include "entrynodes.h"
#include "hibernate.h"
#include "main.h" #include "main.h"
#include "microdesc.h" #include "microdesc.h"
#include "networkstatus.h" #include "networkstatus.h"
@ -1208,6 +1209,14 @@ should_delay_dir_fetches(const or_options_t *options, const char **msg_out)
return 1; return 1;
} }
if (we_are_hibernating()) {
if (msg_out) {
*msg_out = "We are hibernating or shutting down.";
}
log_info(LD_DIR, "Delaying dir fetches (Hibernating or shutting down)");
return 1;
}
if (options->UseBridges) { if (options->UseBridges) {
if (!any_bridge_descriptors_known()) { if (!any_bridge_descriptors_known()) {
if (msg_out) { if (msg_out) {

View File

@ -4531,7 +4531,7 @@ signed_desc_digest_is_recognized(signed_descriptor_t *desc)
void void
update_all_descriptor_downloads(time_t now) update_all_descriptor_downloads(time_t now)
{ {
if (get_options()->DisableNetwork) if (should_delay_dir_fetches(get_options(), NULL))
return; return;
update_router_descriptor_downloads(now); update_router_descriptor_downloads(now);
update_microdesc_downloads(now); update_microdesc_downloads(now);