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
This commit is contained in:
Roger Dingledine 2006-01-17 04:16:59 +00:00
parent d5acef191c
commit d682c84e79
3 changed files with 14 additions and 5 deletions

View File

@ -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 */

View File

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

View File

@ -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);
int i, n_conns;
connection_t **carray;
while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
AP_CONN_STATE_RENDDESC_WAIT, query))) {
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));