|
@@ -335,7 +335,9 @@ addressmap_match_superdomains(char *address)
|
|
|
* was a .exit.
|
|
|
*/
|
|
|
int
|
|
|
-addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out,
|
|
|
+addressmap_rewrite(char *address, size_t maxlen,
|
|
|
+ unsigned flags,
|
|
|
+ time_t *expires_out,
|
|
|
addressmap_entry_source_t *exit_source_out)
|
|
|
{
|
|
|
addressmap_entry_t *ent;
|
|
@@ -368,6 +370,16 @@ addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out,
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
+ if (ent && ent->source == ADDRMAPSRC_DNS) {
|
|
|
+ sa_family_t f;
|
|
|
+ tor_addr_t tmp;
|
|
|
+ f = tor_addr_parse(&tmp, ent->new_address);
|
|
|
+ if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
|
|
|
+ goto done;
|
|
|
+ else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
if (ent->dst_wildcard && !exact_match) {
|
|
|
strlcat(address, ".", maxlen);
|
|
|
strlcat(address, ent->new_address, maxlen);
|
|
@@ -409,11 +421,22 @@ addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out,
|
|
|
* *<b>expires_out</b> to the expiry time of the result, or to <b>time_max</b>
|
|
|
* if the result does not expire. */
|
|
|
int
|
|
|
-addressmap_rewrite_reverse(char *address, size_t maxlen, time_t *expires_out)
|
|
|
+addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags,
|
|
|
+ time_t *expires_out)
|
|
|
{
|
|
|
char *s, *cp;
|
|
|
addressmap_entry_t *ent;
|
|
|
int r = 0;
|
|
|
+ {
|
|
|
+ sa_family_t f;
|
|
|
+ tor_addr_t tmp;
|
|
|
+ f = tor_addr_parse(&tmp, address);
|
|
|
+ if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
|
|
|
+ return 0;
|
|
|
+ else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
tor_asprintf(&s, "REVERSE[%s]", address);
|
|
|
ent = strmap_get(addressmap, s);
|
|
|
if (ent) {
|