diff options
author | Roger Dingledine <arma@torproject.org> | 2004-12-05 12:47:46 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2004-12-05 12:47:46 +0000 |
commit | 1c9c813866d3ee5b71577694824fbe7ed1ab4f3b (patch) | |
tree | 07065a261bb8d8d7218da9e0927604320df8a7fb /src/or | |
parent | 5ba33281721c8f5563d2a22fff0cab8b49fc8ef2 (diff) | |
download | tor-1c9c813866d3ee5b71577694824fbe7ed1ab4f3b.tar tor-1c9c813866d3ee5b71577694824fbe7ed1ab4f3b.tar.gz |
check if we have a cached resolve for a tor-resolve address *after*
we remove the .foo.exit part of the address.
svn:r3082
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/connection_edge.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index f25719a98..5367f03b7 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -363,25 +363,6 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { return sockshere; } /* else socks handshake is done, continue processing */ - if (socks->command == SOCKS_COMMAND_RESOLVE) { - uint32_t answer; - /* Reply to resolves immediately if we can. */ - if (strlen(socks->address) > RELAY_PAYLOAD_SIZE) { - log_fn(LOG_WARN,"Address to be resolved is too large. Failing."); - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR,0,NULL); - return -1; - } - answer = htonl(client_dns_lookup_entry(socks->address)); - if (answer) { - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_IPV4,4, - (char*)&answer); - conn->has_sent_end = 1; - connection_mark_for_close(conn); - conn->hold_open_until_flushed = 1; - return 0; - } - } - /* Parse the address provided by SOCKS. Modify it in-place if it * specifies a hidden-service (.onion) or particular exit node (.exit). */ @@ -400,6 +381,26 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { if (addresstype != ONION_HOSTNAME) { /* not a hidden-service request (i.e. normal or .exit) */ + + if (socks->command == SOCKS_COMMAND_RESOLVE) { + uint32_t answer; + /* Reply to resolves immediately if we can. */ + if (strlen(socks->address) > RELAY_PAYLOAD_SIZE) { + log_fn(LOG_WARN,"Address to be resolved is too large. Failing."); + connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR,0,NULL); + return -1; + } + answer = htonl(client_dns_lookup_entry(socks->address)); + if (answer) { + connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_IPV4,4, + (char*)&answer); + conn->has_sent_end = 1; + connection_mark_for_close(conn); + conn->hold_open_until_flushed = 1; + return 0; + } + } + if (socks->command == SOCKS_COMMAND_CONNECT && socks->port == 0) { log_fn(LOG_WARN,"Application asked to connect to port 0. Refusing."); return -1; |