Commit cec616a0 authored by David Goulet's avatar David Goulet 🤘
Browse files

hs-v3: Don't BUG() if descriptor is found on SOCKS connection retry



When retrying all SOCKS connection because new directory information just
arrived, do not BUG() if a connection in state AP_CONN_STATE_RENDDESC_WAIT is
found to have a usable descriptor.

There is a rare case when this can happen as detailed in #28669 so the right
thing to do is put that connection back in circuit wait state so the
descriptor can be retried.

Fixes #28669

Signed-off-by: David Goulet's avatarDavid Goulet <dgoulet@torproject.org>
parent 43bd4d75
o Minor bugfix (hidden service v3, client):
- Avoid a BUG() stacktrace in case a SOCKS connection is found waiting for
the descriptor while we do have it in the cache. There is a rare case
when this can happen. Now, tor will recover and retry the descriptor.
Fixes bug 28669; bugfix on 0.3.2.4-alpha.
......@@ -296,12 +296,19 @@ retry_all_socks_conn_waiting_for_desc(void)
/* Order a refetch in case it works this time. */
status = hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk);
if (BUG(status == HS_CLIENT_FETCH_HAVE_DESC)) {
/* This case is unique because it can NOT happen in theory. Once we get
* a new descriptor, the HS client subsystem is notified immediately and
* the connections waiting for it are handled which means the state will
* change from renddesc wait state. Log this and continue to next
* connection. */
if (status == HS_CLIENT_FETCH_HAVE_DESC) {
/* This is a rare case where a SOCKS connection is in state waiting for
* a descriptor but we do have it in the cache.
*
* This can happen is tor comes back from suspend where it previously
* had the descriptor but the intro points were not usuable. Once it
* came back to life, the intro point failure cache was cleaned up and
* thus the descriptor became usable again leaving us in this code path.
*
* We'll mark the connection as waiting for a circuit so the descriptor
* can be retried. This is safe because a connection in state waiting
* for a descriptor can not be in the entry connection pending list. */
mark_conn_as_waiting_for_circuit(base_conn, approx_time());
continue;
}
/* In the case of an error, either all SOCKS connections have been
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment