diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/or/circuituse.c | 6 | ||||
-rw-r--r-- | src/or/router.c | 15 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 311af5dfbe..246f6c50c9 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1674,7 +1674,11 @@ circuit_launch(uint8_t purpose, int flags) return circuit_launch_by_extend_info(purpose, NULL, flags); } -/* DOCDOC */ +/* Do we have enough descriptors to build paths? + * If need_exit is true, return 1 if we can build exit paths. + * (We need at least one Exit in the consensus to build exit paths.) + * If need_exit is false, return 1 if we can build internal paths. + */ static int have_enough_path_info(int need_exit) { diff --git a/src/or/router.c b/src/or/router.c index 68bcf1326e..3f94703a26 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1549,8 +1549,10 @@ proxy_mode(const or_options_t *options) * and * - We have ORPort set * and - * - We believe both our ORPort and DirPort (if present) are reachable from + * - We believe our ORPort and DirPort (if present) are reachable from * the outside; or + * - We believe our ORPort is reachable from the outside, and we can't + * check our DirPort because the consensus has no exits; or * - We are an authoritative directory server. */ static int @@ -1568,8 +1570,15 @@ decide_if_publishable_server(void) return 1; if (!router_get_advertised_or_port(options)) return 0; - - return check_whether_orport_reachable() && check_whether_dirport_reachable(); + if (!check_whether_orport_reachable()) + return 0; + if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL) { + /* All set: there are no exits in the consensus (maybe this is a tiny + * test network), so we can't check our DirPort reachability. */ + return 1; + } else { + return check_whether_dirport_reachable(); + } } /** Initiate server descriptor upload as reasonable (if server is publishable, |