[tor-commits] [tor/release-0.4.5] Merge branch 'tor-gitlab/mr/284' into ticket2667_043_01
dgoulet at torproject.org
dgoulet at torproject.org
Wed Feb 3 14:50:40 UTC 2021
commit 705fd37875c4acd61037da6a2680678ae128e4a4
Merge: 79cb47cfc2 9eba65bd8b
Author: David Goulet <dgoulet at torproject.org>
Date: Fri Jan 29 14:51:38 2021 -0500
Merge branch 'tor-gitlab/mr/284' into ticket2667_043_01
changes/ticket2667 | 4 ++
src/core/or/address_set.c | 74 +++++++++++++++++++++++++++++++++++
src/core/or/address_set.h | 18 ++++++++-
src/core/or/connection_edge.c | 25 ++++++++++++
src/feature/nodelist/dirlist.c | 11 ++++--
src/feature/nodelist/nodelist.c | 87 +++++++++++++++++++++++++++++------------
src/feature/nodelist/nodelist.h | 6 ++-
src/test/test_address_set.c | 80 +++++++++++++++++++++++++++++++++++++
8 files changed, 274 insertions(+), 31 deletions(-)
diff --cc src/feature/nodelist/nodelist.c
index 6c7fd6d0f9,9d553ce1f5..5df8e63073
--- a/src/feature/nodelist/nodelist.c
+++ b/src/feature/nodelist/nodelist.c
@@@ -633,14 -664,16 +665,17 @@@ nodelist_set_consensus(networkstatus_t
SMARTLIST_FOREACH(the_nodelist->nodes, node_t *, node,
node->rs = NULL);
- /* Conservatively estimate that every node will have 2 addresses. */
+ /* Conservatively estimate that every node will have 2 addresses (v4 and
+ * v6). Then we add the number of configured trusted authorities we have. */
int estimated_addresses = smartlist_len(ns->routerstatus_list) *
get_estimated_address_per_node();
- estimated_addresses += (get_n_authorities(V3_DIRINFO & BRIDGE_DIRINFO) *
+ estimated_addresses += (get_n_authorities(V3_DIRINFO | BRIDGE_DIRINFO) *
get_estimated_address_per_node());
address_set_free(the_nodelist->node_addrs);
+ addr_port_set_free(the_nodelist->reentry_set);
the_nodelist->node_addrs = address_set_new(estimated_addresses);
+ /* Times two here is for both the ORPort and DirPort. */
+ the_nodelist->reentry_set = addr_port_set_new(estimated_addresses * 2);
SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) {
node_t *node = node_get_or_create(rs->identity_digest);
diff --cc src/test/test_address_set.c
index 829ecd79e8,6d9fab67ab..4c99008ae3
--- a/src/test/test_address_set.c
+++ b/src/test/test_address_set.c
@@@ -179,9 -174,87 +179,88 @@@ test_nodelist(void *arg
UNMOCK(networkstatus_get_latest_consensus);
UNMOCK(networkstatus_get_latest_consensus_by_flavor);
UNMOCK(get_estimated_address_per_node);
+ UNMOCK(dirlist_add_trusted_dir_addresses);
}
+ /** Test that the no-reentry exit filter works as intended */
+ static void
+ test_exit_no_reentry(void *arg)
+ {
+ routerstatus_t *rs = NULL; microdesc_t *md = NULL; routerinfo_t *ri = NULL;
+ (void) arg;
+
+ MOCK(networkstatus_get_latest_consensus,
+ mock_networkstatus_get_latest_consensus);
+ MOCK(networkstatus_get_latest_consensus_by_flavor,
+ mock_networkstatus_get_latest_consensus_by_flavor);
+ MOCK(get_estimated_address_per_node,
+ mock_get_estimated_address_per_node);
+ MOCK(dirlist_add_trusted_dir_addresses,
+ mock_dirlist_add_trusted_dir_addresses);
+
+ dummy_ns = tor_malloc_zero(sizeof(*dummy_ns));
+ dummy_ns->flavor = FLAV_MICRODESC;
+ dummy_ns->routerstatus_list = smartlist_new();
+
+ tor_addr_t addr_v4, addr_v6, dummy_addr;
+ tor_addr_parse(&addr_v4, "42.42.42.42");
+ tor_addr_parse(&addr_v6, "1:2:3:4::");
+ memset(&dummy_addr, 'A', sizeof(dummy_addr));
+
+ /* This will make the nodelist bloom filter very large
+ * (the_nodelist->node_addrs) so we will fail the contain test rarely. */
+ addr_per_node = 1024;
+
+ /* After this point the nodelist is populated with the directory authorities
+ * address and ports */
+ nodelist_set_consensus(dummy_ns);
+
+ /* The address set is empty. Try it anyway */
+ tt_assert(!nodelist_reentry_probably_contains(&addr_v4, 244));
+ tt_assert(!nodelist_reentry_probably_contains(&addr_v6, 244));
+
+ /* Now let's populate the network */
+ md = tor_malloc_zero(sizeof(*md));
+ ri = tor_malloc_zero(sizeof(*ri));
+ rs = tor_malloc_zero(sizeof(*rs));
+ crypto_rand(rs->identity_digest, sizeof(rs->identity_digest));
+ crypto_rand(md->digest, sizeof(md->digest));
+ memcpy(rs->descriptor_digest, md->digest, DIGEST256_LEN);
+
+ /* Setup the rs, ri and md addresses. */
+ rs->addr = tor_addr_to_ipv4h(&addr_v4);
+ rs->or_port = 444;
+ tor_addr_parse(&rs->ipv6_addr, "1:2:3:4::");
+ rs->ipv6_orport = 666;
+ ri->addr = tor_addr_to_ipv4h(&addr_v4);
+ tor_addr_parse(&ri->ipv6_addr, "1:2:3:4::");
+ tor_addr_parse(&md->ipv6_addr, "1:2:3:4::");
+
+ /* Add the rs to the consensus becoming a node_t. */
+ smartlist_add(dummy_ns->routerstatus_list, rs);
+ nodelist_set_consensus(dummy_ns);
+
+ /* Now that the nodelist is populated let's do some retry attempts */
+
+ /* First let's try an address that is on the no-reentry list, but with a
+ different port */
+ tt_assert(!nodelist_reentry_probably_contains(&addr_v4, 666));
+ tt_assert(!nodelist_reentry_probably_contains(&addr_v6, 444));
+
+ /* OK now let's try with the right address and right port */
+ tt_assert(nodelist_reentry_probably_contains(&addr_v4, 444));
+ tt_assert(nodelist_reentry_probably_contains(&addr_v6, 666));
+
+ done:
+ routerstatus_free(rs); routerinfo_free(ri); microdesc_free(md);
+ smartlist_clear(dummy_ns->routerstatus_list);
+ networkstatus_vote_free(dummy_ns);
+ UNMOCK(networkstatus_get_latest_consensus);
+ UNMOCK(networkstatus_get_latest_consensus_by_flavor);
+ UNMOCK(get_estimated_address_per_node);
+ UNMOCK(dirlist_add_trusted_dir_addresses);
+ }
+
struct testcase_t address_set_tests[] = {
{ "contains", test_contains, TT_FORK,
NULL, NULL },
More information about the tor-commits
mailing list