diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-01-04 03:03:50 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-01-04 03:03:50 +0000 |
commit | e53bba1e2ab53cbbe8bb266645011b031e4e2de6 (patch) | |
tree | 0c1600f3c798a338989e2bfe0bf6091be2fd6462 | |
parent | 4ee823668bd9fff003b7b099956fff8fa9b9acc8 (diff) | |
download | tor-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-- | ChangeLog | 4 | ||||
-rw-r--r-- | doc/TODO.020 | 2 | ||||
-rw-r--r-- | src/or/dns.c | 14 |
3 files changed, 13 insertions, 7 deletions
@@ -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", |