diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-05-27 14:07:41 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-05-31 19:15:36 -0400 |
commit | c4c7dcd453b62b3d3bcc8e78df8455a77645e62a (patch) | |
tree | 5819f36e9a2bb0db8129fcccff188df1c0203453 | |
parent | e8ac2a84774214596b031599e134cb4fa886dd1f (diff) | |
download | tor-c4c7dcd453b62b3d3bcc8e78df8455a77645e62a.tar.gz tor-c4c7dcd453b62b3d3bcc8e78df8455a77645e62a.zip |
Do not report a node as a "chosen exit" when it is not in fact an exit.
Provide a useful warning when launch_circuit tries to make us use a
node we don't want to use. Just give an info message when this is a
normal and okay situation. Fix for logging issues in bug 984.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/or/circuitbuild.c | 66 |
2 files changed, 62 insertions, 8 deletions
@@ -12,6 +12,10 @@ Changes in version 0.2.1.16-?? - 2009-??-?? o Minor bugfixes (on 0.2.1.x): - When switching back and forth between bridge mode, do not start gathering GeoIP data until two hours have passed. + - Do not complain that the user has requested an excluded node as + an exit when the node is not really an exit. This could happen + because the circuit was for testing, or an introduction point. + Fix for bug 984. Changes in version 0.2.1.15-rc - 2009-05-25 diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 777f16aad2..d78981e09b 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -1436,17 +1436,67 @@ choose_good_exit_server(uint8_t purpose, routerlist_t *dir, /** Log a warning if the user specified an exit for the circuit that * has been excluded from use by ExcludeNodes or ExcludeExitNodes. */ static void -warn_if_router_excluded(const extend_info_t *exit) +warn_if_last_router_excluded(uint8_t purpose, const extend_info_t *exit) { or_options_t *options = get_options(); - routerinfo_t *ri = router_get_by_digest(exit->identity_digest); + routerset_t *rs = options->ExcludeNodes; + const char *description; + int severity; + int domain = LD_CIRC; - if (!ri || !options->_ExcludeExitNodesUnion) - return; + switch (purpose) + { + default: + case CIRCUIT_PURPOSE_OR: + case CIRCUIT_PURPOSE_INTRO_POINT: + case CIRCUIT_PURPOSE_REND_POINT_WAITING: + case CIRCUIT_PURPOSE_REND_ESTABLISHED: + log_warn(LD_BUG, "Called on non-origin circuit (purpose %d)", + (int)purpose); + return; + case CIRCUIT_PURPOSE_C_GENERAL: + description = "Requested exit node"; + rs = options->_ExcludeExitNodesUnion; + severity = LOG_WARN; + break; + case CIRCUIT_PURPOSE_C_INTRODUCING: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: + description = "Introduction point for hidden service"; + severity = LOG_INFO; + break; + case CIRCUIT_PURPOSE_C_ESTABLISH_REND: + case CIRCUIT_PURPOSE_C_REND_READY: + case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: + case CIRCUIT_PURPOSE_C_REND_JOINED: + description = "Chosen rendezvous point"; + severity = LOG_WARN; + domain = LD_BUG; + break; + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + description = "Chosen introduction point"; + severity = LOG_INFO; + break; + case CIRCUIT_PURPOSE_S_CONNECT_REND: + case CIRCUIT_PURPOSE_S_REND_JOINED: + description = "Client-selected rendezvous point"; + severity = LOG_INFO; + break; + case CIRCUIT_PURPOSE_TESTING: + description = "Target for testing circuit"; + severity = LOG_INFO; + break; + case CIRCUIT_PURPOSE_CONTROLLER: + rs = options->_ExcludeExitNodesUnion; + description = "Controller-selected circuit target"; + severity = LOG_WARN; + break; + } - if (routerset_contains_router(options->_ExcludeExitNodesUnion, ri)) - log_warn(LD_CIRC,"Requested exit node '%s' is in ExcludeNodes, " - "or ExcludeExitNodes, using anyway.",exit->nickname); + if (routerset_contains_extendinfo(rs, exit)) + log_fn(severity, domain, "%s '%s' is in ExcludeNodes%s. Using anyway.", + description,exit->nickname, + rs==options->ExcludeNodes?"":" or ExcludeExitNodes."); return; } @@ -1471,7 +1521,7 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) } if (exit) { /* the circuit-builder pre-requested one */ - warn_if_router_excluded(exit); + warn_if_last_router_excluded(circ->_base.purpose, exit); log_info(LD_CIRC,"Using requested exit node '%s'", exit->nickname); exit = extend_info_dup(exit); } else { /* we have to decide one */ |