- Avoid crashing when we have a policy specified in a DirPolicy or
SocksPolicy or ReachableAddresses option with ports set on it, and we
re-load the policy. May fix bug 996.
- - Hidden service clients didn't use a cached service descriptor that
- was older than 15 minutes, but wouldn't fetch a new one either. Now,
- use a cached descriptor no matter how old it is and only fetch a new
- one when all introduction points fail. Fix for bug 997. Patch from
- Marcus Griep.
- - Fix refetching of hidden service descriptors when all introduction
- points have turned out to not work. Fixes more of bug 997.
-
o Minor bugfixes (on 0.2.1.x):
- When switching back and forth between bridge mode, do not start
if (conn->rend_data->auth_type == REND_NO_AUTH)
rend_client_refetch_renddesc(conn->rend_data->onion_address);
} else { /* r > 0 */
- conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
- log_info(LD_REND, "Descriptor is here and fresh enough. Great.");
- if (connection_ap_handshake_attach_circuit(conn) < 0) {
- if (!conn->_base.marked_for_close)
- connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
- return -1;
+/** How long after we receive a hidden service descriptor do we consider
+ * it valid? */
+#define NUM_SECONDS_BEFORE_HS_REFETCH (60*15)
+ if (now - entry->received < NUM_SECONDS_BEFORE_HS_REFETCH) {
+ conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
+ log_info(LD_REND, "Descriptor is here and fresh enough. Great.");
+ if (connection_ap_handshake_attach_circuit(conn) < 0) {
+ if (!conn->_base.marked_for_close)
+ connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
+ return -1;
+ }
+ } else {
+ conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT;
+ log_info(LD_REND, "Stale descriptor %s. Re-fetching.",
+ safe_str(conn->rend_data->onion_address));
+ /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
+ * arrives first. Exception: When using client authorization, only
+ * fetch v2 descriptors.*/
+ rend_client_refetch_v2_renddesc(conn->rend_data);
+ if (conn->rend_data->auth_type == REND_NO_AUTH)
+ rend_client_refetch_renddesc(conn->rend_data->onion_address);
}
}
return 0;
}
}
-/** Unless we already have a descriptor for <b>rend_query</b> with at least
- * one (possibly) working introduction point in it, start a connection to a
- * hidden service directory to fetch a v2 rendezvous service descriptor. */
+/** Start a connection to a hidden service directory to fetch a v2
+ * rendezvous service descriptor for the base32-encoded service ID
+ * <b>query</b>.
+ */
void
rend_client_refetch_v2_renddesc(const rend_data_t *rend_query)
{