aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2006-01-17 04:16:59 +0000
committerRoger Dingledine <arma@torproject.org>2006-01-17 04:16:59 +0000
commitd682c84e7969aa4b86eb4f7b759ee9cb9b6797b3 (patch)
tree9978b6e912491a69a1dd787b5767ec95bfe37357 /src
parentd5acef191c2d20cf30cd6ea8379da6972b426f1b (diff)
downloadtor-d682c84e7969aa4b86eb4f7b759ee9cb9b6797b3.tar.gz
tor-d682c84e7969aa4b86eb4f7b759ee9cb9b6797b3.zip
attempted patch for bug 220: don't assert when we've tried all the
intro points for a hidden service and we try fetching the service descriptor again. svn:r5838
Diffstat (limited to 'src')
-rw-r--r--src/or/connection.c1
-rw-r--r--src/or/connection_edge.c2
-rw-r--r--src/or/rendclient.c18
3 files changed, 15 insertions, 6 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index 137b11b06f..01d8b23014 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -337,6 +337,7 @@ connection_about_to_close_connection(connection_t *conn)
/* It's a directory connection and connecting or fetching
* failed: forget about this router, and maybe try again. */
connection_dir_request_failed(conn);
+ // XXX if it's rend desc we may want to retry -RD
}
if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC)
rend_client_desc_here(conn->rend_query); /* give it a try */
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 93d6e884a3..42f49bfe75 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -1133,7 +1133,7 @@ connection_ap_handshake_process_socks(connection_t *conn)
/* see if we already have it cached */
r = rend_cache_lookup_entry(conn->rend_query, -1, &entry);
if (r<0) {
- warn(LD_REND,"Invalid service descriptor %s",
+ warn(LD_BUG,"Bug: Invalid service name '%s'",
safe_str(conn->rend_query));
connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
return -1;
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 3e89d8fa92..1ab8ed5bae 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -258,7 +258,7 @@ rend_client_refetch_renddesc(const char *query)
}
}
-/** remove failed_intro from ent. if ent now has no intro points, or
+/** Remove failed_intro from ent. If ent now has no intro points, or
* service is unrecognized, then launch a new renddesc fetch.
*
* Return -1 if error, 0 if no intro points remain or service
@@ -423,9 +423,18 @@ rend_client_desc_here(const char *query)
connection_t *conn;
rend_cache_entry_t *entry;
time_t now = time(NULL);
-
- while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
- AP_CONN_STATE_RENDDESC_WAIT, query))) {
+ int i, n_conns;
+ connection_t **carray;
+
+ get_connection_array(&carray, &n_conns);
+
+ for (i = 0; i < n_conns; ++i) {
+ conn = carray[i];
+ if (conn->type != CONN_TYPE_AP ||
+ conn->state != AP_CONN_STATE_RENDDESC_WAIT ||
+ conn->marked_for_close ||
+ rend_cmp_service_ids(query, conn->rend_query))
+ continue;
assert_connection_ok(conn, now);
if (rend_cache_lookup_entry(conn->rend_query, -1, &entry) == 1 &&
entry->parsed->n_intro_points > 0) {
@@ -445,7 +454,6 @@ rend_client_desc_here(const char *query)
warn(LD_REND,"Rendezvous attempt failed. Closing.");
connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
}
- tor_assert(conn->state != AP_CONN_STATE_RENDDESC_WAIT); /* avoid loop */
} else { /* 404, or fetch didn't get that far */
notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
"unavailable (try again later).", safe_str(query));