mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Use router_crn_flags in more places, to pass direct-connect flag
In order to fix 25691 and 25692, we need to pass the "direct_conn" flag to more places -- particularly when choosing single-hop tunnels. The right way to do this involves having a couple more functions accept router_crn_flags_t, rather than a big list of boolean arguments. This commit also makes sure that choose_good_exit_server_general() honors the direct_conn flag, to fix 25691 and 25692.
This commit is contained in:
parent
388d217c40
commit
7915efd1b8
@ -1827,7 +1827,7 @@ ap_stream_wants_exit_attention(connection_t *conn)
|
|||||||
* Return NULL if we can't find any suitable routers.
|
* Return NULL if we can't find any suitable routers.
|
||||||
*/
|
*/
|
||||||
static const node_t *
|
static const node_t *
|
||||||
choose_good_exit_server_general(int need_uptime, int need_capacity)
|
choose_good_exit_server_general(router_crn_flags_t flags)
|
||||||
{
|
{
|
||||||
int *n_supported;
|
int *n_supported;
|
||||||
int n_pending_connections = 0;
|
int n_pending_connections = 0;
|
||||||
@ -1837,6 +1837,9 @@ choose_good_exit_server_general(int need_uptime, int need_capacity)
|
|||||||
const or_options_t *options = get_options();
|
const or_options_t *options = get_options();
|
||||||
const smartlist_t *the_nodes;
|
const smartlist_t *the_nodes;
|
||||||
const node_t *selected_node=NULL;
|
const node_t *selected_node=NULL;
|
||||||
|
const int need_uptime = (flags & CRN_NEED_UPTIME) != 0;
|
||||||
|
const int need_capacity = (flags & CRN_NEED_CAPACITY) != 0;
|
||||||
|
const int direct_conn = (flags & CRN_DIRECT_CONN) != 0;
|
||||||
|
|
||||||
connections = get_connection_array();
|
connections = get_connection_array();
|
||||||
|
|
||||||
@ -1869,7 +1872,7 @@ choose_good_exit_server_general(int need_uptime, int need_capacity)
|
|||||||
*/
|
*/
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!node_has_preferred_descriptor(node, 0)) {
|
if (!node_has_preferred_descriptor(node, direct_conn)) {
|
||||||
n_supported[i] = -1;
|
n_supported[i] = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1982,7 +1985,8 @@ choose_good_exit_server_general(int need_uptime, int need_capacity)
|
|||||||
need_capacity?", fast":"",
|
need_capacity?", fast":"",
|
||||||
need_uptime?", stable":"");
|
need_uptime?", stable":"");
|
||||||
tor_free(n_supported);
|
tor_free(n_supported);
|
||||||
return choose_good_exit_server_general(0, 0);
|
flags &= ~(CRN_NEED_UPTIME|CRN_NEED_CAPACITY);
|
||||||
|
return choose_good_exit_server_general(flags);
|
||||||
}
|
}
|
||||||
log_notice(LD_CIRC, "All routers are down or won't exit%s -- "
|
log_notice(LD_CIRC, "All routers are down or won't exit%s -- "
|
||||||
"choosing a doomed exit at random.",
|
"choosing a doomed exit at random.",
|
||||||
@ -2229,17 +2233,11 @@ pick_restricted_middle_node(router_crn_flags_t flags,
|
|||||||
* toward the preferences in 'options'.
|
* toward the preferences in 'options'.
|
||||||
*/
|
*/
|
||||||
static const node_t *
|
static const node_t *
|
||||||
choose_good_exit_server(origin_circuit_t *circ, int need_uptime,
|
choose_good_exit_server(origin_circuit_t *circ,
|
||||||
int need_capacity, int is_internal, int need_hs_v3)
|
router_crn_flags_t flags, int is_internal)
|
||||||
{
|
{
|
||||||
const or_options_t *options = get_options();
|
const or_options_t *options = get_options();
|
||||||
router_crn_flags_t flags = CRN_NEED_DESC;
|
flags |= CRN_NEED_DESC;
|
||||||
if (need_uptime)
|
|
||||||
flags |= CRN_NEED_UPTIME;
|
|
||||||
if (need_capacity)
|
|
||||||
flags |= CRN_NEED_CAPACITY;
|
|
||||||
if (need_hs_v3)
|
|
||||||
flags |= CRN_RENDEZVOUS_V3;
|
|
||||||
|
|
||||||
switch (TO_CIRCUIT(circ)->purpose) {
|
switch (TO_CIRCUIT(circ)->purpose) {
|
||||||
case CIRCUIT_PURPOSE_C_HSDIR_GET:
|
case CIRCUIT_PURPOSE_C_HSDIR_GET:
|
||||||
@ -2253,7 +2251,7 @@ choose_good_exit_server(origin_circuit_t *circ, int need_uptime,
|
|||||||
if (is_internal) /* pick it like a middle hop */
|
if (is_internal) /* pick it like a middle hop */
|
||||||
return router_choose_random_node(NULL, options->ExcludeNodes, flags);
|
return router_choose_random_node(NULL, options->ExcludeNodes, flags);
|
||||||
else
|
else
|
||||||
return choose_good_exit_server_general(need_uptime,need_capacity);
|
return choose_good_exit_server_general(flags);
|
||||||
case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
|
case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
|
||||||
{
|
{
|
||||||
/* Pick a new RP */
|
/* Pick a new RP */
|
||||||
@ -2378,15 +2376,22 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit_ei,
|
|||||||
extend_info_describe(exit_ei));
|
extend_info_describe(exit_ei));
|
||||||
exit_ei = extend_info_dup(exit_ei);
|
exit_ei = extend_info_dup(exit_ei);
|
||||||
} else { /* we have to decide one */
|
} else { /* we have to decide one */
|
||||||
|
router_crn_flags_t flags = CRN_NEED_DESC;
|
||||||
|
if (state->need_uptime)
|
||||||
|
flags |= CRN_NEED_UPTIME;
|
||||||
|
if (state->need_capacity)
|
||||||
|
flags |= CRN_NEED_CAPACITY;
|
||||||
|
if (is_hs_v3_rp_circuit)
|
||||||
|
flags |= CRN_RENDEZVOUS_V3;
|
||||||
|
if (state->onehop_tunnel)
|
||||||
|
flags |= CRN_DIRECT_CONN;
|
||||||
const node_t *node =
|
const node_t *node =
|
||||||
choose_good_exit_server(circ, state->need_uptime,
|
choose_good_exit_server(circ, flags, state->is_internal);
|
||||||
state->need_capacity, state->is_internal,
|
|
||||||
is_hs_v3_rp_circuit);
|
|
||||||
if (!node) {
|
if (!node) {
|
||||||
log_warn(LD_CIRC,"Failed to choose an exit server");
|
log_warn(LD_CIRC,"Failed to choose an exit server");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
exit_ei = extend_info_from_node(node, 0);
|
exit_ei = extend_info_from_node(node, state->onehop_tunnel);
|
||||||
if (BUG(exit_ei == NULL))
|
if (BUG(exit_ei == NULL))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user