diff options
author | Roger Dingledine <arma@torproject.org> | 2006-01-17 04:16:59 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2006-01-17 04:16:59 +0000 |
commit | d682c84e7969aa4b86eb4f7b759ee9cb9b6797b3 (patch) | |
tree | 9978b6e912491a69a1dd787b5767ec95bfe37357 /src | |
parent | d5acef191c2d20cf30cd6ea8379da6972b426f1b (diff) | |
download | tor-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.c | 1 | ||||
-rw-r--r-- | src/or/connection_edge.c | 2 | ||||
-rw-r--r-- | src/or/rendclient.c | 18 |
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)); |