|
@@ -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));
|