[tor-commits] [tor/maint-0.2.4] Merge remote-tracking branch 'origin/maint-0.2.3' into maint-0.2.4

nickm at torproject.org nickm at torproject.org
Mon Mar 18 19:28:43 UTC 2013


commit 2ac66e59f7b32bb7f975803c9d483848e755a08f
Merge: 5959d1c ebb95d0
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Mar 18 15:28:39 2013 -0400

    Merge remote-tracking branch 'origin/maint-0.2.3' into maint-0.2.4
    
    Conflicts:
    	src/test/test_addr.c

 changes/bug8377      |    3 +++
 src/common/address.c |    3 ++-
 src/test/test_addr.c |   36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletions(-)

diff --cc src/test/test_addr.c
index 890dfe4,e3f3807..fec85a4
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@@ -723,134 -623,48 +723,170 @@@ test_addr_ip6_helpers(void
    ;
  }
  
 +/** Test tor_addr_port_parse(). */
 +static void
 +test_addr_parse(void)
 +{
 +  int r;
 +  tor_addr_t addr;
 +  char buf[TOR_ADDR_BUF_LEN];
 +  uint16_t port = 0;
 +
 +  /* Correct call. */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "192.0.2.1:1234",
 +                         &addr, &port);
 +  test_assert(r == 0);
 +  tor_addr_to_str(buf, &addr, sizeof(buf), 0);
 +  test_streq(buf, "192.0.2.1");
 +  test_eq(port, 1234);
 +
 +  /* Domain name. */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "torproject.org:1234",
 +                         &addr, &port);
 +  test_assert(r == -1);
 +
 +  /* Only IP. */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "192.0.2.2",
 +                         &addr, &port);
 +  test_assert(r == -1);
 +
 +  /* Bad port. */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "192.0.2.2:66666",
 +                         &addr, &port);
 +  test_assert(r == -1);
 +
 +  /* Only domain name */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "torproject.org",
 +                         &addr, &port);
 +  test_assert(r == -1);
 +
 +  /* Bad IP address */
 +  r= tor_addr_port_parse(LOG_DEBUG,
 +                         "192.0.2:1234",
 +                         &addr, &port);
 +  test_assert(r == -1);
 +
 + done:
 +  ;
 +}
 +
 +static void
 +update_difference(int ipv6, uint8_t *d,
 +                  const tor_addr_t *a, const tor_addr_t *b)
 +{
 +  const int n_bytes = ipv6 ? 16 : 4;
 +  uint8_t a_tmp[4], b_tmp[4];
 +  const uint8_t *ba, *bb;
 +  int i;
 +
 +  if (ipv6) {
 +    ba = tor_addr_to_in6_addr8(a);
 +    bb = tor_addr_to_in6_addr8(b);
 +  } else {
 +    set_uint32(a_tmp, tor_addr_to_ipv4n(a));
 +    set_uint32(b_tmp, tor_addr_to_ipv4n(b));
 +    ba = a_tmp; bb = b_tmp;
 +  }
 +
 +  for (i = 0; i < n_bytes; ++i) {
 +    d[i] |= ba[i] ^ bb[i];
 +  }
 +}
 +
 +static void
 +test_virtaddrmap(void *data)
 +{
 +  /* Let's start with a bunch of random addresses. */
 +  int ipv6, bits, iter, b;
 +  virtual_addr_conf_t cfg[2];
 +  uint8_t bytes[16];
 +
 +  (void)data;
 +
 +  tor_addr_parse(&cfg[0].addr, "64.65.0.0");
 +  tor_addr_parse(&cfg[1].addr, "3491:c0c0::");
 +
 +  for (ipv6 = 0; ipv6 <= 1; ++ipv6) {
 +    for (bits = 0; bits < 18; ++bits) {
 +      tor_addr_t last_a;
 +      cfg[ipv6].bits = bits;
 +      memset(bytes, 0, sizeof(bytes));
 +      tor_addr_copy(&last_a, &cfg[ipv6].addr);
 +      /* Generate 128 addresses with each addr/bits combination. */
 +      for (iter = 0; iter < 128; ++iter) {
 +        tor_addr_t a;
 +
 +        get_random_virtual_addr(&cfg[ipv6], &a);
 +        //printf("%s\n", fmt_addr(&a));
 +        /* Make sure that the first b bits match the configured network */
 +        tt_int_op(0, ==, tor_addr_compare_masked(&a, &cfg[ipv6].addr,
 +                                                 bits, CMP_EXACT));
 +
 +        /* And track which bits have been different between pairs of
 +         * addresses */
 +        update_difference(ipv6, bytes, &last_a, &a);
 +      }
 +
 +      /* Now make sure all but the first 'bits' bits of bytes are true */
 +      for (b = bits+1; b < (ipv6?128:32); ++b) {
 +        tt_assert(1 & (bytes[b/8] >> (7-(b&7))));
 +      }
 +    }
 +  }
 +
 + done:
 +  ;
 +}
 +
+ static void
+ test_addr_is_loopback(void *data)
+ {
+   static const struct loopback_item {
+     const char *name;
+     int is_loopback;
+   } loopback_items[] = {
+     { "::1", 1 },
+     { "127.0.0.1", 1 },
+     { "127.99.100.101", 1 },
+     { "128.99.100.101", 0 },
+     { "8.8.8.8", 0 },
+     { "0.0.0.0", 0 },
+     { "::2", 0 },
+     { "::", 0 },
+     { "::1.0.0.0", 0 },
+     { NULL, 0 }
+   };
+ 
+   int i;
+   tor_addr_t addr;
+   (void)data;
+ 
+   for (i=0; loopback_items[i].name; ++i) {
+     tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), >=, 0);
+     tt_int_op(tor_addr_is_loopback(&addr), ==, loopback_items[i].is_loopback);
+   }
+ 
+   tor_addr_make_unspec(&addr);
+   tt_int_op(tor_addr_is_loopback(&addr), ==, 0);
+ 
+  done:
+   ;
+ }
+ 
  #define ADDR_LEGACY(name)                                               \
    { #name, legacy_test_helper, 0, &legacy_setup, test_addr_ ## name }
  
  struct testcase_t addr_tests[] = {
    ADDR_LEGACY(basic),
    ADDR_LEGACY(ip6_helpers),
 +  ADDR_LEGACY(parse),
 +  { "virtaddr", test_virtaddrmap, 0, NULL, NULL },
+   { "is_loopback", test_addr_is_loopback, 0, NULL, NULL },
    END_OF_TESTCASES
  };
  



More information about the tor-commits mailing list