summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-01-04 03:03:50 +0000
committerNick Mathewson <nickm@torproject.org>2009-01-04 03:03:50 +0000
commite53bba1e2ab53cbbe8bb266645011b031e4e2de6 (patch)
tree0c1600f3c798a338989e2bfe0bf6091be2fd6462
parent4ee823668bd9fff003b7b099956fff8fa9b9acc8 (diff)
downloadtor-e53bba1e2ab53cbbe8bb266645011b031e4e2de6.tar.gz
tor-e53bba1e2ab53cbbe8bb266645011b031e4e2de6.zip
Backport r17138: Fix the rest of bug 619: reject *:* servers should not do DNS lookups, even if broken clients send them RELAY_BEGIN cells. Patch from rovv.
svn:r17870
-rw-r--r--ChangeLog4
-rw-r--r--doc/TODO.0202
-rw-r--r--src/or/dns.c14
3 files changed, 13 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f9321cf96..fbd7aec34f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -56,6 +56,10 @@ Changes in version 0.2.0.33 - 2009-??-??
prevent possible guess-the-streamid injection attacks from
intermediate hops. Fixes another case of bug 446. Based on patch
from rovv.
+ - If a broken client asks a non-exit router to connect somewhere,
+ do not even do the DNS lookup before rejecting the connection.
+ Fixes another case of bug 619. Patch from rovv.
+
o Minor features:
- Report the case where all signatures in a detached set are rejected
diff --git a/doc/TODO.020 b/doc/TODO.020
index 16c6cb5cbb..d9ecdbf351 100644
--- a/doc/TODO.020
+++ b/doc/TODO.020
@@ -17,7 +17,7 @@ Backport for 0.2.0 once better tested:
o See also r17181...
o ... and r17184.
o r17137: send END cell in response to connect to nonexistent hidserv port.
- - r17138: reject *:* servers should never do DNS lookups.
+ o r17138: reject *:* servers should never do DNS lookups.
o r17139: Fix another case of overriding .exit choices.
o r17162 and r17164: fix another case of not checking cpath_layer.
- r17208,r17209,r7211,r17212,r17214: Avoid gotterdammerung when an
diff --git a/src/or/dns.c b/src/or/dns.c
index c8da9969d6..a91fbaab47 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -563,14 +563,10 @@ dns_resolve(edge_connection_t *exitconn)
or_circuit_t *oncirc = TO_OR_CIRCUIT(exitconn->on_circuit);
int is_resolve, r;
char *hostname = NULL;
- routerinfo_t *me = router_get_my_routerinfo();
is_resolve = exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE;
- if (is_resolve && me &&
- policy_is_reject_star(me->exit_policy)) /* non-exit */
- r = -1;
- else
- r = dns_resolve_impl(exitconn, is_resolve, oncirc, &hostname);
+ r = dns_resolve_impl(exitconn, is_resolve, oncirc, &hostname);
+
switch (r) {
case 1:
/* We got an answer without a lookup -- either the answer was
@@ -645,6 +641,7 @@ dns_resolve_impl(edge_connection_t *exitconn, int is_resolve,
cached_resolve_t *resolve;
cached_resolve_t search;
pending_connection_t *pending_connection;
+ routerinfo_t *me;
struct in_addr in;
time_t now = time(NULL);
uint8_t is_reverse = 0;
@@ -661,6 +658,11 @@ dns_resolve_impl(edge_connection_t *exitconn, int is_resolve,
exitconn->address_ttl = DEFAULT_DNS_TTL;
return 1;
}
+ /* If we're a non-exit, don't even do DNS lookups. */
+ if (!(me = router_get_my_routerinfo()) ||
+ policy_is_reject_star(me->exit_policy)) {
+ return -1;
+ }
if (address_is_invalid_destination(exitconn->_base.address, 0)) {
log(LOG_PROTOCOL_WARN, LD_EXIT,
"Rejecting invalid destination address %s",