summaryrefslogtreecommitdiff
path: root/src/or/connection_edge.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2014-04-08 18:02:03 -0400
committerNick Mathewson <nickm@torproject.org>2015-01-13 12:41:15 -0500
commit9d0fab9872807ef212fadb3feb299cf6309a185f (patch)
treee7dcafceb46a841cfe1fe67da22b747ebe3aa675 /src/or/connection_edge.c
parentab6bd78eca0f3edc7ed910d8567c409fe3dfdd92 (diff)
downloadtor-9d0fab9872807ef212fadb3feb299cf6309a185f.tar.gz
tor-9d0fab9872807ef212fadb3feb299cf6309a185f.zip
Allow MapAddress and Automap to work together
The trick here is to apply mapaddress first, and only then apply automapping. Otherwise, the automap checks don't get done. Fix for bug 7555; bugfix on all versions of Tor supporting both MapAddress and AutoMap.
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r--src/or/connection_edge.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index ca99a86ae0..7a77f5e20a 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -946,6 +946,15 @@ connection_ap_handshake_rewrite(entry_connection_t *conn,
if (! conn->original_dest_address)
conn->original_dest_address = tor_strdup(conn->socks_request->address);
+ if (socks->command != SOCKS_COMMAND_RESOLVE_PTR) {
+ const unsigned rewrite_flags = AMR_FLAG_USE_MAPADDRESS;
+ if (addressmap_rewrite(socks->address, sizeof(socks->address),
+ rewrite_flags, &out->map_expires, &out->exit_source)) {
+ control_event_stream_status(conn, STREAM_EVENT_REMAP,
+ REMAP_STREAM_SOURCE_CACHE);
+ }
+ }
+
if (socks->command == SOCKS_COMMAND_RESOLVE &&
tor_addr_parse(&addr_tmp, socks->address)<0 &&
options->AutomapHostsOnResolve) {
@@ -1014,16 +1023,20 @@ connection_ap_handshake_rewrite(entry_connection_t *conn,
}
} else if (!out->automap) {
/* For address map controls, remap the address. */
- unsigned rewrite_flags = 0;
+ unsigned rewrite_flags = AMR_FLAG_USE_AUTOMAP | AMR_FLAG_USE_TRACKEXIT;
+ addressmap_entry_source_t exit_source2;
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(socks->address, sizeof(socks->address),
- rewrite_flags, &out->map_expires, &out->exit_source)) {
+ rewrite_flags, &out->map_expires, &exit_source2)) {
control_event_stream_status(conn, STREAM_EVENT_REMAP,
REMAP_STREAM_SOURCE_CACHE);
}
+ if (out->exit_source == ADDRMAPSRC_NONE) {
+ out->exit_source = exit_source2;
+ }
}
if (!out->automap && address_is_in_virtual_range(socks->address)) {