[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [tor/maint-0.2.0] Backport fix for bug 997.
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Tue, 16 Jun 2009 22:07:16 +0200
Subject: Backport fix for bug 997.
Commit: da347295323ec288da4da91d5a925e2fd19d09bc
Backporting 6a32beb and ca8708a.
---
ChangeLog | 7 +++++++
src/or/connection_edge.c | 22 +++++-----------------
src/or/rendclient.c | 7 +++----
src/or/rendcommon.c | 5 +++++
4 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index c2c6186..e12f40c 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 0474a46..a513ea3 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 81e5c69..98e9abc 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 28d4223..d2d5eb3 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;
}
--
1.5.6.5