diff options
author | Nick Mathewson <nickm@torproject.org> | 2012-11-27 20:53:09 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-12-17 14:50:05 -0500 |
commit | 8eb422e7bda1d9ffbd0032f343c7a00af6d81ef2 (patch) | |
tree | 7597c58c8fdbe235afd90b3052db2cf93c3e8b05 /src/or | |
parent | 593b235cc95f3b4a3b6c2abec852a59786cb768b (diff) | |
download | tor-8eb422e7bda1d9ffbd0032f343c7a00af6d81ef2.tar tor-8eb422e7bda1d9ffbd0032f343c7a00af6d81ef2.tar.gz |
Don't use the cache when changing an IP address because of an exit policy
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/relay.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/or/relay.c b/src/or/relay.c index 8955d31bb..2103087ee 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -706,6 +706,7 @@ connection_ap_process_end_not_open( case END_STREAM_REASON_EXITPOLICY: if (rh->length >= 5) { tor_addr_t addr; + int ttl = -1; tor_addr_make_unspec(&addr); if (rh->length == 5 || rh->length == 9) { @@ -745,6 +746,16 @@ connection_ap_process_end_not_open( client_dns_set_addressmap(conn, conn->socks_request->address, &addr, conn->chosen_exit_name, ttl); + + { + char new_addr[TOR_ADDR_BUF_LEN]; + tor_addr_to_str(new_addr, &addr, sizeof(new_addr), 1); + if (strcmp(conn->socks_request->address, new_addr)) { + strlcpy(conn->socks_request->address, new_addr, + sizeof(conn->socks_request->address)); + control_event_stream_status(conn, STREAM_EVENT_REMAP, 0); + } + } } /* check if he *ought* to have allowed it */ if (exitrouter && @@ -757,19 +768,7 @@ connection_ap_process_end_not_open( node_describe(exitrouter)); policies_set_node_exitpolicy_to_reject_all(exitrouter); } - /* rewrite it to an IP if we learned one. */ - { - unsigned rewrite_flags = 0; - if (conn->use_cached_ipv4_answers) - rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->use_cached_ipv6_answers) - rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; - if (addressmap_rewrite(conn->socks_request->address, - sizeof(conn->socks_request->address), - rewrite_flags, NULL, NULL)) { - control_event_stream_status(conn, STREAM_EVENT_REMAP, 0); - } - } + if (conn->chosen_exit_optional || conn->chosen_exit_retries) { /* stop wanting a specific exit */ |