aboutsummaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-11-27 20:53:09 -0500
committerNick Mathewson <nickm@torproject.org>2012-12-17 14:50:05 -0500
commit8eb422e7bda1d9ffbd0032f343c7a00af6d81ef2 (patch)
tree7597c58c8fdbe235afd90b3052db2cf93c3e8b05 /src/or
parent593b235cc95f3b4a3b6c2abec852a59786cb768b (diff)
downloadtor-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.c25
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 */