16 #define ADDRESSMAP_PRIVATE
60 addressmap_entry_source_bitfield_t source:3;
61 unsigned src_wildcard:1;
62 unsigned dst_wildcard:1;
63 short num_resolve_failures;
70 char *hostname_address;
96 #define addressmap_ent_free(ent) \
97 FREE_AND_NULL(addressmap_entry_t, addressmap_ent_free_, (ent))
111 addressmap_ent_free_void(
void *ent)
116 #define addressmap_virtaddress_ent_free(ent) \
117 FREE_AND_NULL(virtaddress_entry_t, addressmap_virtaddress_ent_free_, (ent))
132 addressmap_virtaddress_ent_free_void(
void *ent)
142 if (ent && ent->new_address &&
148 if (!strcmp(address, ve->ipv4_address))
150 if (!strcmp(address, ve->ipv6_address))
152 if (!strcmp(address, ve->hostname_address))
154 if (!ve->ipv4_address && !ve->ipv6_address && !ve->hostname_address) {
168 addressmap_ent_free(ent);
188 } STRMAP_FOREACH_END;
199 const routerset_t *allow_nodes = options->
ExitNodes;
211 const char *target = ent->new_address, *dot;
225 len = strlen(target);
228 dot = target + len - 6;
229 while (dot > target && *dot !=
'.')
231 if (*dot ==
'.') dot++;
232 nodename = tor_strndup(dot, len-5-(dot-target));
243 } STRMAP_FOREACH_END;
258 if (!strcmp(suffix,
"."))
262 } SMARTLIST_FOREACH_END(suffix);
283 int remove_this = clear_all;
298 } STRMAP_FOREACH_END;
330 strmap_free(
addressmap, addressmap_ent_free_void);
355 while ((cp = strchr(cp,
'.'))) {
358 if (val && val->src_wildcard) {
359 if (val->dst_wildcard)
390 time_t expires = TIME_MAX;
392 char *addr_orig = tor_strdup(address);
393 char *log_addr_orig = NULL;
397 for (rewrites = 0; rewrites < 16; rewrites++) {
404 if (!ent || !ent->new_address) {
410 if (ent->src_wildcard && !ent->dst_wildcard &&
411 !strcasecmp(address, ent->new_address)) {
420 if (!ent || !ent->new_address) {
427 switch (ent->source) {
433 if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
435 else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
441 if (!(flags & AMR_FLAG_USE_MAPADDRESS))
445 if (!(flags & AMR_FLAG_USE_AUTOMAP))
449 if (!(flags & AMR_FLAG_USE_TRACKEXIT))
454 log_warn(
LD_BUG,
"Unknown addrmap source value %d. Ignoring it.",
461 if (ent->dst_wildcard && !exact_match) {
462 strlcat(address,
".", maxlen);
463 strlcat(address, ent->new_address, maxlen);
465 strlcpy(address, ent->new_address, maxlen);
472 exit_source = ent->source;
475 log_info(
LD_APP,
"Addressmap: rewriting %s to %s",
477 if (ent->expires > 1 && ent->expires < expires)
478 expires = ent->expires;
483 "Loop detected: we've rewritten %s 16 times! Using it as-is.",
491 *exit_source_out = exit_source;
493 *expires_out = expires;
494 return (rewrites > 0);
513 if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
515 else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
525 log_info(
LD_APP,
"Rewrote reverse lookup %s -> %s",
528 strlcpy(address, ent->new_address, maxlen);
533 *expires_out = (ent && ent->expires > 1) ? ent->expires : TIME_MAX;
550 ent->expires=time(NULL) + update_expiry;
578 const int wildcard_addr,
579 const int wildcard_new_addr)
583 if (wildcard_new_addr)
587 if (!new_address || (!strcasecmp(address,new_address) &&
588 wildcard_addr == wildcard_new_addr)) {
600 }
else if (ent->new_address) {
602 log_info(
LD_APP,
"Temporary addressmap ('%s' to '%s') not performed, "
603 "since it's already mapped to '%s'",
604 safe_str_client(address),
605 safe_str_client(new_address),
606 safe_str_client(ent->new_address));
619 ent->new_address = new_address;
620 ent->expires = expires==2 ? 1 : expires;
621 ent->num_resolve_failures = 0;
622 ent->source = source;
623 ent->src_wildcard = wildcard_addr ? 1 : 0;
624 ent->dst_wildcard = wildcard_new_addr ? 1 : 0;
626 log_info(
LD_CONFIG,
"Addressmap: (re)mapped '%s' to '%s'",
627 safe_str_client(address),
628 safe_str_client(ent->new_address));
645 if (ent->num_resolve_failures < SHRT_MAX)
646 ++ent->num_resolve_failures;
647 log_info(
LD_APP,
"Address %s now has %d resolve failures.",
648 safe_str_client(address),
649 ent->num_resolve_failures);
650 return ent->num_resolve_failures;
663 ent->num_resolve_failures = 0;
678 const char *address,
const char *
name,
679 const char *exitname,
682 char *extendedaddress=NULL, *extendedval=NULL;
698 "%s.%s.exit", address, exitname);
700 "%s.%s.exit",
name, exitname);
726 const char *exitname,
742 if (! for_conn->entry_cfg.cache_ipv6_answers)
763 const char *address,
const char *v,
764 const char *exitname,
772 (f == AF_INET6 && ! for_conn->entry_cfg.cache_ipv6_answers))
788 static virtual_addr_conf_t virtaddr_conf_ipv4;
789 static virtual_addr_conf_t virtaddr_conf_ipv6;
801 const int ipv6 = (family == AF_INET6);
804 const int max_prefix_bits = ipv6 ? 104 : 16;
805 virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4;
807 if (!val || val[0] ==
'\0') {
809 tor_asprintf(msg,
"Value not present (%s) after VirtualAddressNetwork%s",
810 val?
"Empty":
"NULL", ipv6?
"IPv6":
"");
815 tor_asprintf(msg,
"Error parsing VirtualAddressNetwork%s %s",
816 ipv6?
"IPv6":
"", val);
821 tor_asprintf(msg,
"Incorrect address type for VirtualAddressNetwork%s",
826 if (port_min != 1 || port_max != 65535) {
828 tor_asprintf(msg,
"Can't specify ports on VirtualAddressNetwork%s",
834 if (bits > max_prefix_bits) {
836 tor_asprintf(msg,
"VirtualAddressNetwork%s expects a /%d "
837 "network or larger",ipv6?
"IPv6":
"", max_prefix_bits);
862 const virtual_addr_conf_t *conf = (
tor_addr_family(&addr) == AF_INET6) ?
863 &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4;
877 const uint8_t *addr_bytes;
880 const int total_bytes = ipv6 ? 16 : 4;
897 memcpy(bytes, addr_bytes, conf->bits / 8);
898 if (conf->bits & 7) {
899 uint8_t mask = 0xff >> (conf->bits & 7);
900 bytes[conf->bits/8] &= mask;
901 bytes[conf->bits/8] |= addr_bytes[conf->bits/8] & ~mask;
910 conf->bits, CMP_EXACT)==0);
925 if (type == RESOLVED_TYPE_HOSTNAME) {
929 base32_encode(buf,
sizeof(buf),rand_bytes,
sizeof(rand_bytes));
930 strlcat(buf,
".virtual",
sizeof(buf));
932 return tor_strdup(buf);
933 }
else if (type == RESOLVED_TYPE_IPV4 || type == RESOLVED_TYPE_IPV6) {
934 const int ipv6 = (type == RESOLVED_TYPE_IPV6);
935 const virtual_addr_conf_t *conf = ipv6 ?
936 &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4;
944 uint32_t attempts = 1000;
954 if ((a & 0xff) == 0 || (a & 0xff) == 0xff)
966 log_warn(
LD_BUG,
"%s wasn't in the addressmap, but %s was.",
972 return tor_strdup(buf);
975 log_warn(
LD_CONFIG,
"Ran out of virtual addresses!");
979 log_warn(
LD_BUG,
"Called with unsupported address type (%d)", type);
999 int vent_needs_to_be_added = 0;
1008 vent_needs_to_be_added = 1;
1011 if (type == RESOLVED_TYPE_IPV4)
1012 addrp = &vent->ipv4_address;
1013 else if (type == RESOLVED_TYPE_IPV6)
1014 addrp = &vent->ipv6_address;
1016 addrp = &vent->hostname_address;
1020 if (ent && ent->new_address &&
1021 !strcasecmp(new_address, ent->new_address)) {
1027 "Internal confusion: I thought that '%s' was mapped to by "
1028 "'%s', but '%s' really maps to '%s'. This is a harmless bug.",
1029 safe_str_client(new_address),
1030 safe_str_client(*addrp),
1031 safe_str_client(*addrp),
1032 ent?safe_str_client(ent->new_address):
"(nothing)");
1043 log_info(
LD_APP,
"Registering map from %s to %s", *addrp, new_address);
1044 if (vent_needs_to_be_added)
1056 tor_assert(!strcasecmp(ent->new_address,new_address));
1060 (type == RESOLVED_TYPE_IPV4) ?
1061 vent->ipv4_address : vent->hostname_address));
1062 log_info(
LD_APP,
"Map from %s to %s okay.",
1063 safe_str_client(*addrp),
1064 safe_str_client(new_address));
1083 if (
get_options()->ServerDNSAllowNonRFC953Hostnames)
1095 if (TOR_ISALNUM(*address) ||
1115 time_t max_expires,
int want_expiry)
1117 strmap_iter_t *iter;
1125 for (iter = strmap_iter_init(
addressmap); !strmap_iter_done(iter); ) {
1126 strmap_iter_get(iter, &key, &val_);
1128 if (val->expires >= min_expires && val->expires <= max_expires) {
1130 iter = strmap_iter_next_rmv(
addressmap,iter);
1133 }
else if (val->new_address) {
1134 const char *src_wc = val->src_wildcard ?
"*." :
"";
1135 const char *dst_wc = val->dst_wildcard ?
"*." :
"";
1137 if (val->expires < 3 || val->expires == TIME_MAX)
1139 src_wc, key, dst_wc, val->new_address);
1141 char isotime[ISO_TIME_LEN+1];
1144 src_wc, key, dst_wc, val->new_address,
1149 src_wc, key, dst_wc, val->new_address);