patch from karsten for bug 814. whew.

svn:r16915
This commit is contained in:
Roger Dingledine 2008-09-16 10:17:04 +00:00
parent 3db8c15287
commit 38f2272d5d
5 changed files with 33 additions and 11 deletions

View File

@ -24,6 +24,12 @@ Changes in version 0.2.1.6-alpha - 2008-09-xx
for bug 811. for bug 811.
- Catch and report a few more bootstrapping failure cases when Tor - Catch and report a few more bootstrapping failure cases when Tor
fails to establish a TCP connection. Cleanup on 0.2.1.x. fails to establish a TCP connection. Cleanup on 0.2.1.x.
- When fetching v0 and v2 rendezvous service descriptors in parallel,
do not fail the whole hidden service request only because the v0
descriptor fetch request fails; the v2 request might still succeed.
The other way round, when the last v2 request fails and no v0 request
is going on, do fail the hidden service request. Fixes bug 814.
Bugfix on 0.2.0.10-alpha.
o Minor features: o Minor features:
- Allow ports 465 and 587 in the default exit policy again. We had - Allow ports 465 and 587 in the default exit policy again. We had

View File

@ -523,8 +523,13 @@ connection_about_to_close_connection(connection_t *conn)
* failed: forget about this router, and maybe try again. */ * failed: forget about this router, and maybe try again. */
connection_dir_request_failed(dir_conn); connection_dir_request_failed(dir_conn);
} }
if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC) if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC) {
rend_client_desc_here(dir_conn->rend_query); /* give it a try */ /* Give it a try. However, there is no re-fetching for v0 rend
* descriptors; if the response is empty or the descriptor is
* unusable, close pending connections (unless a v2 request is
* still in progress). */
rend_client_desc_here(dir_conn->rend_query, 0);
}
/* If we were trying to fetch a v2 rend desc and did not succeed, /* If we were trying to fetch a v2 rend desc and did not succeed,
* retry as needed. (If a fetch is successful, the connection state * retry as needed. (If a fetch is successful, the connection state
* is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that

View File

@ -1892,7 +1892,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
} else { } else {
/* success. notify pending connections about this. */ /* success. notify pending connections about this. */
conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
rend_client_desc_here(conn->rend_query); rend_client_desc_here(conn->rend_query, -1);
} }
break; break;
case 404: case 404:
@ -1938,7 +1938,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
log_info(LD_REND, "Successfully fetched v2 rendezvous " log_info(LD_REND, "Successfully fetched v2 rendezvous "
"descriptor."); "descriptor.");
conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
rend_client_desc_here(conn->rend_query); rend_client_desc_here(conn->rend_query, -1);
break; break;
} }
break; break;

View File

@ -3842,7 +3842,7 @@ int rend_client_rendezvous_acked(origin_circuit_t *circ, const char *request,
size_t request_len); size_t request_len);
int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request, int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request,
size_t request_len); size_t request_len);
void rend_client_desc_here(const char *query); void rend_client_desc_here(const char *query, int rend_version);
extend_info_t *rend_client_get_random_intro(const char *query); extend_info_t *rend_client_get_random_intro(const char *query);

View File

@ -462,6 +462,8 @@ rend_client_refetch_v2_renddesc(const char *query)
log_info(LD_REND, "Could not pick one of the responsible hidden " log_info(LD_REND, "Could not pick one of the responsible hidden "
"service directories to fetch descriptors, because " "service directories to fetch descriptors, because "
"we already tried them all unsuccessfully."); "we already tried them all unsuccessfully.");
/* Close pending connections (unless a v0 request is still going on). */
rend_client_desc_here(query, 2);
return; return;
} }
@ -625,11 +627,14 @@ rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request,
/** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that /** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that
* are waiting on query. If there's a working cache entry here * are waiting on query. If there's a working cache entry here
* with at least one intro point, move them to the next state; * with at least one intro point, move them to the next state. If
* else fail them. * <b>rend_version</b> is non-negative, fail connections that have
* requested <b>query</b> unless there are still descriptor fetch
* requests in progress for other descriptor versions than
* <b>rend_version</b>.
*/ */
void void
rend_client_desc_here(const char *query) rend_client_desc_here(const char *query, int rend_version)
{ {
edge_connection_t *conn; edge_connection_t *conn;
rend_cache_entry_t *entry; rend_cache_entry_t *entry;
@ -666,9 +671,15 @@ rend_client_desc_here(const char *query)
connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
} }
} else { /* 404, or fetch didn't get that far */ } else { /* 404, or fetch didn't get that far */
log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is " /* Unless there are requests for another descriptor version pending,
"unavailable (try again later).", safe_str(query)); * close the connection. */
connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED); if (rend_version >= 0 &&
!connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query,
rend_version == 0 ? 2 : 0)) {
log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
"unavailable (try again later).", safe_str(query));
connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
}
} }
}); });
} }