aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarsten Loesing <karsten.loesing@gmx.net>2009-06-16 22:07:16 +0200
committerNick Mathewson <nickm@torproject.org>2009-06-16 16:46:01 -0400
commitda347295323ec288da4da91d5a925e2fd19d09bc (patch)
tree63121dc9908ddf04f31d860b08bb906da9ea6873
parent632579f5927dd319e6841b30be88d4388d9041eb (diff)
downloadtor-da347295323ec288da4da91d5a925e2fd19d09bc.tar.gz
tor-da347295323ec288da4da91d5a925e2fd19d09bc.zip
Backport fix for bug 997.
Backporting 6a32beb and ca8708a.
-rw-r--r--ChangeLog7
-rw-r--r--src/or/connection_edge.c22
-rw-r--r--src/or/rendclient.c7
-rw-r--r--src/or/rendcommon.c5
4 files changed, 20 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index c2c61865f2..e12f40c7f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -22,6 +22,13 @@ Changes in version 0.2.0.35 - 2009-??-??
- When starting with a cache over a few days old, do not leak
memory for the obsolete router descriptors in it. Bugfix on
0.2.0.33; fixes bug 672.
+ - Hidden service clients didn't use a cached service descriptor that
+ was older than 15 minutes, but wouldn't fetch a new one either. Now,
+ use a cached descriptor no matter how old it is and only fetch a new
+ one when all introduction points fail. Fix for bug 997. Patch from
+ Marcus Griep.
+ - Fix refetching of hidden service descriptors when all introduction
+ points have turned out to not work. Fixes more of bug 997.
Changes in version 0.2.0.34 - 2009-02-08
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 0474a469d7..a513ea3c99 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -1610,24 +1610,12 @@ connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn,
rend_client_refetch_v2_renddesc(conn->rend_query);
rend_client_refetch_renddesc(conn->rend_query);
} else { /* r > 0 */
-/** How long after we receive a hidden service descriptor do we consider
- * it valid? */
-#define NUM_SECONDS_BEFORE_HS_REFETCH (60*15)
- if (now - entry->received < NUM_SECONDS_BEFORE_HS_REFETCH) {
- conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
- log_info(LD_REND, "Descriptor is here and fresh enough. Great.");
- if (connection_ap_handshake_attach_circuit(conn) < 0) {
+ conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
+ log_info(LD_REND, "Descriptor is here and fresh enough. Great.");
+ if (connection_ap_handshake_attach_circuit(conn) < 0) {
+ if (!conn->_base.marked_for_close)
connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
- return -1;
- }
- } else {
- conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT;
- log_info(LD_REND, "Stale descriptor %s. Refetching.",
- safe_str(conn->rend_query));
- /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
- * arrives first. */
- rend_client_refetch_v2_renddesc(conn->rend_query);
- rend_client_refetch_renddesc(conn->rend_query);
+ return -1;
}
}
return 0;
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 81e5c69d9d..98e9abc631 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -412,10 +412,9 @@ rend_client_refetch_renddesc(const char *query)
}
}
-/** Start a connection to a hidden service directory to fetch a v2
- * rendezvous service descriptor for the base32-encoded service ID
- * <b>query</b>.
- */
+/** Unless we already have a descriptor for <b>rend_query</b> with at least
+ * one (possibly) working introduction point in it, start a connection to a
+ * hidden service directory to fetch a v2 rendezvous service descriptor. */
void
rend_client_refetch_v2_renddesc(const char *query)
{
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index 28d422343a..d2d5eb3779 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -783,6 +783,11 @@ rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e)
}
if (!*e)
return 0;
+ tor_assert((*e)->parsed && (*e)->parsed->intro_nodes);
+ /* XXX022 hack for now, to return "not found" if there are no intro
+ * points remaining. See bug 997. */
+ if (smartlist_len((*e)->parsed->intro_nodes) == 0)
+ return 0;
return 1;
}