[tor-commits] [tor/master] Clear the timed_out flag when an HS connection attempt ends
nickm at torproject.org
nickm at torproject.org
Mon Oct 3 19:14:00 UTC 2011
commit 34a6b8b7e588b6f10e6e87cf876ef6ada49f8b8a
Author: Robert Ransom <rransom.8774 at gmail.com>
Date: Sat Sep 17 03:23:26 2011 -0700
Clear the timed_out flag when an HS connection attempt ends
---
changes/bug1297b | 8 ++++++++
src/or/circuituse.c | 7 +++++++
src/or/connection_edge.c | 12 ++++++++++++
src/or/rendclient.c | 23 +++++++++++++++++++++++
src/or/rendclient.h | 2 ++
5 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/changes/bug1297b b/changes/bug1297b
new file mode 100644
index 0000000..6b0169d
--- /dev/null
+++ b/changes/bug1297b
@@ -0,0 +1,8 @@
+ o Minor bugfixes:
+
+ - When one of a hidden service's introduction points times out,
+ consider trying it again during the next attempt to connect to
+ the HS. Previously, we would not try it again unless a newly
+ fetched descriptor contained it. Required by fixes for bugs
+ 1297 and 3825.
+
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 0ad8b3b..f2fd6fe 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -1464,6 +1464,13 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ,
/* assert_connection_ok(conn, time(NULL)); */
circ->p_streams = apconn;
+ if (connection_edge_is_rendezvous_stream(apconn)) {
+ /* We are attaching a stream to a rendezvous circuit. That means
+ * that an attempt to connect to a hidden service just
+ * succeeded. Tell rendclient.c. */
+ rend_client_note_connection_attempt_ended(apconn->rend_data->onion_address);
+ }
+
if (cpath) { /* we were given one; use it */
tor_assert(cpath_is_on_circuit(circ, cpath));
apconn->cpath_layer = cpath;
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 8609b02..0c5ebde 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -68,6 +68,18 @@ _connection_mark_unattached_ap(edge_connection_t *conn, int endreason,
tor_assert(conn->_base.type == CONN_TYPE_AP);
conn->edge_has_sent_end = 1; /* no circ yet */
+ /* If this is a rendezvous stream and it is failing without ever
+ * being attached to a circuit, assume that an attempt to connect to
+ * the destination hidden service has just ended.
+ *
+ * XXX023 This condition doesn't limit to only streams failing
+ * without ever being attached. That sloppiness should be harmless,
+ * but we should fix it someday anyway. */
+ if ((conn->on_circuit != NULL || conn->edge_has_sent_end) &&
+ connection_edge_is_rendezvous_stream(conn)) {
+ rend_client_note_connection_attempt_ended(conn->rend_data->onion_address);
+ }
+
if (conn->_base.marked_for_close) {
/* This call will warn as appropriate. */
_connection_mark_for_close(TO_CONN(conn), line, file);
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 013d544..3c1c116 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -881,10 +881,33 @@ rend_client_desc_trynow(const char *query)
"unavailable (try again later).",
safe_str_client(query));
connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
+ rend_client_note_connection_attempt_ended(query);
}
} SMARTLIST_FOREACH_END(_conn);
}
+/** Clear temporary state used only during an attempt to connect to
+ * the hidden service named <b>onion_address</b>. Called when a
+ * connection attempt has ended; may be called occasionally at other
+ * times, and should be reasonably harmless. */
+void
+rend_client_note_connection_attempt_ended(const char *onion_address)
+{
+ rend_cache_entry_t *cache_entry = NULL;
+ rend_cache_lookup_entry(onion_address, -1, &cache_entry);
+
+ log_info(LD_REND, "Connection attempt for %s has ended; "
+ "cleaning up temporary state.",
+ safe_str_client(onion_address));
+
+ /* Clear the timed_out flag on all remaining intro points for this HS. */
+ if (cache_entry != NULL) {
+ SMARTLIST_FOREACH(cache_entry->parsed->intro_nodes,
+ rend_intro_point_t *, ip,
+ ip->timed_out = 0; );
+ }
+}
+
/** Return a newly allocated extend_info_t* for a randomly chosen introduction
* point for the named hidden service. Return NULL if all introduction points
* have been tried and failed.
diff --git a/src/or/rendclient.h b/src/or/rendclient.h
index 3421e07..46779b7 100644
--- a/src/or/rendclient.h
+++ b/src/or/rendclient.h
@@ -38,6 +38,8 @@ int rend_client_receive_rendezvous(origin_circuit_t *circ,
size_t request_len);
void rend_client_desc_trynow(const char *query);
+void rend_client_note_connection_attempt_ended(const char *onion_address);
+
extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query);
int rend_client_any_intro_points_usable(const rend_cache_entry_t *entry);
More information about the tor-commits
mailing list