diff options
author | Nick Mathewson <nickm@torproject.org> | 2016-05-04 15:23:38 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-05-04 15:23:38 -0400 |
commit | 2da2718609841bb7028ae2c802e26d80c857fe90 (patch) | |
tree | 7f3e1bf11110e9f4e3c7e39e81374c7acb31dbcd /src/or/directory.c | |
parent | 27c1b0ea4330e4aee8b464543bbe03b932005368 (diff) | |
parent | 01e7f42a09108e71cede46d4a038c4b1253a3d42 (diff) | |
download | tor-2da2718609841bb7028ae2c802e26d80c857fe90.tar.gz tor-2da2718609841bb7028ae2c802e26d80c857fe90.zip |
Merge branch 'maint-0.2.8'
Diffstat (limited to 'src/or/directory.c')
-rw-r--r-- | src/or/directory.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/or/directory.c b/src/or/directory.c index 45061aea9c..f74e470a50 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -630,7 +630,6 @@ directory_choose_address_routerstatus(const routerstatus_t *status, tor_assert(use_or_ap != NULL); tor_assert(use_dir_ap != NULL); - const int anonymized_connection = dirind_is_anon(indirection); int have_or = 0, have_dir = 0; /* We expect status to have at least one reachable address if we're @@ -652,13 +651,16 @@ directory_choose_address_routerstatus(const routerstatus_t *status, tor_addr_make_null(&use_dir_ap->addr, AF_UNSPEC); use_dir_ap->port = 0; - if (anonymized_connection) { - /* Use the primary (IPv4) OR address if we're making an indirect - * connection. */ - tor_addr_from_ipv4h(&use_or_ap->addr, status->addr); - use_or_ap->port = status->or_port; - have_or = 1; - } else { + /* ORPort connections */ + if (indirection == DIRIND_ANONYMOUS) { + if (status->addr) { + /* Since we're going to build a 3-hop circuit and ask the 2nd relay + * to extend to this address, always use the primary (IPv4) OR address */ + tor_addr_from_ipv4h(&use_or_ap->addr, status->addr); + use_or_ap->port = status->or_port; + have_or = 1; + } + } else if (indirection == DIRIND_ONEHOP) { /* We use an IPv6 address if we have one and we prefer it. * Use the preferred address and port if they are reachable, otherwise, * use the alternate address and port (if any). @@ -668,9 +670,15 @@ directory_choose_address_routerstatus(const routerstatus_t *status, use_or_ap); } - have_dir = fascist_firewall_choose_address_rs(status, - FIREWALL_DIR_CONNECTION, 0, - use_dir_ap); + /* DirPort connections + * DIRIND_ONEHOP uses ORPort, but may fall back to the DirPort */ + if (indirection == DIRIND_DIRECT_CONN || + indirection == DIRIND_ANON_DIRPORT || + indirection == DIRIND_ONEHOP) { + have_dir = fascist_firewall_choose_address_rs(status, + FIREWALL_DIR_CONNECTION, 0, + use_dir_ap); + } /* We rejected all addresses in the relay's status. This means we can't * connect to it. */ |