aboutsummaryrefslogtreecommitdiff
path: root/src/or/directory.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-02-23 12:32:15 -0500
committerNick Mathewson <nickm@torproject.org>2011-02-23 12:32:15 -0500
commit22ec4d5426eecf1a8021d9b6b95f9a1518e96110 (patch)
tree0ac399a5a1cc4cbb307abe3dd9a8d790269376fa /src/or/directory.c
parent92651641807c861c8f66ec3f117fbf3121450ad3 (diff)
downloadtor-22ec4d5426eecf1a8021d9b6b95f9a1518e96110.tar.gz
tor-22ec4d5426eecf1a8021d9b6b95f9a1518e96110.zip
Fix infinite recursion when connect() fails in microdesc consensus fetch
The underlying fix is to stop indicating requests "ns" consensuses by putting NULL in their requested_resource field: we already had a specialized meaning for requested_resource==NULL, which was (more or less) "Treat a failure here as a network failure, since it's too early to possibly be a resource or directory failure." Overloading the two meant that very early microdesc consensus download failures would get treated as ns consensus download failures, so the failure count there would get incremented, but the microdesc download would get retried immediately in an infinite loop. Fix for bug2381. Diagnosed by mobmix.
Diffstat (limited to 'src/or/directory.c')
-rw-r--r--src/or/directory.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index 7137fe1fab..a53a0c6b98 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -631,9 +631,8 @@ connection_dir_request_failed(dir_connection_t *conn)
connection_dir_bridge_routerdesc_failed(conn);
connection_dir_download_routerdesc_failed(conn);
} else if (conn->_base.purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
- const char *flavname =
- conn->requested_resource ? conn->requested_resource : "ns";
- networkstatus_consensus_download_failed(0, flavname);
+ if (conn->requested_resource)
+ networkstatus_consensus_download_failed(0, conn->requested_resource);
} else if (conn->_base.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) {
log_info(LD_DIR, "Giving up on certificate fetch from directory server "
"at '%s'; retrying",
@@ -1004,8 +1003,14 @@ directory_get_consensus_url(int supports_conditional_consensus,
const char *resource)
{
char *url = NULL;
- const char *hyphen = resource ? "-" : "";
- const char *flavor = resource ? resource : "";
+ const char *hyphen, *flavor;
+ if (resource==NULL || strcmp(resource, "ns")==0) {
+ flavor = ""; /* Request ns consensuses as "", so older servers will work*/
+ hyphen = "";
+ } else {
+ flavor = resource;
+ hyphen = "-";
+ }
if (supports_conditional_consensus) {
char *authority_id_list;
@@ -1746,8 +1751,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
if (conn->_base.purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
int r;
- const char *flavname =
- conn->requested_resource ? conn->requested_resource : "ns";
+ const char *flavname = conn->requested_resource;
if (status_code != 200) {
int severity = (status_code == 304) ? LOG_INFO : LOG_WARN;
log(severity, LD_DIR,