aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2005-11-29 17:14:10 +0000
committerNick Mathewson <nickm@torproject.org>2005-11-29 17:14:10 +0000
commit94e8dcef442d63ddb811d26e2caccf188f3ed3cf (patch)
tree87981d5faba8e362ea8ac5b879de86495f80c909 /src
parentc90d6c7e5f9617d6c0351a9c1b569d65ce57fae6 (diff)
downloadtor-94e8dcef442d63ddb811d26e2caccf188f3ed3cf.tar
tor-94e8dcef442d63ddb811d26e2caccf188f3ed3cf.tar.gz
Fix a bug weasel found: when we are an authority and somebody requests "all" statuses, cconsider regenerating our own.
svn:r5466
Diffstat (limited to 'src')
-rw-r--r--src/or/dirserv.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 6588a561d..391405526 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1139,6 +1139,14 @@ router_is_general_exit(routerinfo_t *ri)
/** For authoritative directories: the current (v2) network status */
static cached_dir_t the_v2_networkstatus = { NULL, NULL, 0, 0, 0 };
+static int
+should_generate_v2_networkstatus(void)
+{
+ return get_options()->AuthoritativeDir &&
+ the_v2_networkstatus_is_dirty &&
+ the_v2_networkstatus_is_dirty + DIR_REGEN_SLACK_TIME < time(NULL);
+}
+
/** For authoritative directories only: replace the contents of
* <b>the_v2_networkstatus</b> with a newly generated network status
* object. */
@@ -1336,7 +1344,10 @@ dirserv_get_networkstatus_v2(smartlist_t *result,
warn(LD_BUG,"Unable to generate an authoritative network status.");
}
} else if (!strcmp(key, "all")) {
- digestmap_iter_t *iter = digestmap_iter_init(cached_v2_networkstatus);
+ digestmap_iter_t *iter;
+ if (should_generate_v2_networkstatus(void))
+ generate_v2_networkstatus();
+ iter = digestmap_iter_init(cached_v2_networkstatus);
while (!digestmap_iter_done(iter)) {
const char *ident;
void *val;
@@ -1353,10 +1364,7 @@ dirserv_get_networkstatus_v2(smartlist_t *result,
SMARTLIST_FOREACH(digests, char *, cp,
{
cached_dir_t *cached;
- if (router_digest_is_me(cp) &&
- get_options()->AuthoritativeDir &&
- the_v2_networkstatus_is_dirty &&
- the_v2_networkstatus_is_dirty + DIR_REGEN_SLACK_TIME < time(NULL))
+ if (router_digest_is_me(cp) && should_generate_v2_networkstatus(void))
generate_v2_networkstatus();
cached = digestmap_get(cached_v2_networkstatus, cp);
if (cached) {