summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-05-27 14:07:41 -0400
committerNick Mathewson <nickm@torproject.org>2009-05-31 19:15:36 -0400
commitc4c7dcd453b62b3d3bcc8e78df8455a77645e62a (patch)
tree5819f36e9a2bb0db8129fcccff188df1c0203453
parente8ac2a84774214596b031599e134cb4fa886dd1f (diff)
downloadtor-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--ChangeLog4
-rw-r--r--src/or/circuitbuild.c66
2 files changed, 62 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 1846832c4f..2ae76b730c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 */