mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Clear the timed_out flag when an HS connection attempt ends
This commit is contained in:
parent
eaed37d14c
commit
34a6b8b7e5
8
changes/bug1297b
Normal file
8
changes/bug1297b
Normal file
@ -0,0 +1,8 @@
|
||||
o Minor bugfixes:
|
||||
|
||||
- When one of a hidden service's introduction points times out,
|
||||
consider trying it again during the next attempt to connect to
|
||||
the HS. Previously, we would not try it again unless a newly
|
||||
fetched descriptor contained it. Required by fixes for bugs
|
||||
1297 and 3825.
|
||||
|
@ -1464,6 +1464,13 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ,
|
||||
/* assert_connection_ok(conn, time(NULL)); */
|
||||
circ->p_streams = apconn;
|
||||
|
||||
if (connection_edge_is_rendezvous_stream(apconn)) {
|
||||
/* We are attaching a stream to a rendezvous circuit. That means
|
||||
* that an attempt to connect to a hidden service just
|
||||
* succeeded. Tell rendclient.c. */
|
||||
rend_client_note_connection_attempt_ended(apconn->rend_data->onion_address);
|
||||
}
|
||||
|
||||
if (cpath) { /* we were given one; use it */
|
||||
tor_assert(cpath_is_on_circuit(circ, cpath));
|
||||
apconn->cpath_layer = cpath;
|
||||
|
@ -68,6 +68,18 @@ _connection_mark_unattached_ap(edge_connection_t *conn, int endreason,
|
||||
tor_assert(conn->_base.type == CONN_TYPE_AP);
|
||||
conn->edge_has_sent_end = 1; /* no circ yet */
|
||||
|
||||
/* If this is a rendezvous stream and it is failing without ever
|
||||
* being attached to a circuit, assume that an attempt to connect to
|
||||
* the destination hidden service has just ended.
|
||||
*
|
||||
* XXX023 This condition doesn't limit to only streams failing
|
||||
* without ever being attached. That sloppiness should be harmless,
|
||||
* but we should fix it someday anyway. */
|
||||
if ((conn->on_circuit != NULL || conn->edge_has_sent_end) &&
|
||||
connection_edge_is_rendezvous_stream(conn)) {
|
||||
rend_client_note_connection_attempt_ended(conn->rend_data->onion_address);
|
||||
}
|
||||
|
||||
if (conn->_base.marked_for_close) {
|
||||
/* This call will warn as appropriate. */
|
||||
_connection_mark_for_close(TO_CONN(conn), line, file);
|
||||
|
@ -881,10 +881,33 @@ rend_client_desc_trynow(const char *query)
|
||||
"unavailable (try again later).",
|
||||
safe_str_client(query));
|
||||
connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
|
||||
rend_client_note_connection_attempt_ended(query);
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(_conn);
|
||||
}
|
||||
|
||||
/** Clear temporary state used only during an attempt to connect to
|
||||
* the hidden service named <b>onion_address</b>. Called when a
|
||||
* connection attempt has ended; may be called occasionally at other
|
||||
* times, and should be reasonably harmless. */
|
||||
void
|
||||
rend_client_note_connection_attempt_ended(const char *onion_address)
|
||||
{
|
||||
rend_cache_entry_t *cache_entry = NULL;
|
||||
rend_cache_lookup_entry(onion_address, -1, &cache_entry);
|
||||
|
||||
log_info(LD_REND, "Connection attempt for %s has ended; "
|
||||
"cleaning up temporary state.",
|
||||
safe_str_client(onion_address));
|
||||
|
||||
/* Clear the timed_out flag on all remaining intro points for this HS. */
|
||||
if (cache_entry != NULL) {
|
||||
SMARTLIST_FOREACH(cache_entry->parsed->intro_nodes,
|
||||
rend_intro_point_t *, ip,
|
||||
ip->timed_out = 0; );
|
||||
}
|
||||
}
|
||||
|
||||
/** Return a newly allocated extend_info_t* for a randomly chosen introduction
|
||||
* point for the named hidden service. Return NULL if all introduction points
|
||||
* have been tried and failed.
|
||||
|
@ -38,6 +38,8 @@ int rend_client_receive_rendezvous(origin_circuit_t *circ,
|
||||
size_t request_len);
|
||||
void rend_client_desc_trynow(const char *query);
|
||||
|
||||
void rend_client_note_connection_attempt_ended(const char *onion_address);
|
||||
|
||||
extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query);
|
||||
int rend_client_any_intro_points_usable(const rend_cache_entry_t *entry);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user