summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2005-10-05 23:20:45 +0000
committerNick Mathewson <nickm@torproject.org>2005-10-05 23:20:45 +0000
commit5cf758764ee9460f9bda8f0494f311ace54c8616 (patch)
treec72e40beedb6a6eee01a92c5f3a1cb2697fea268
parentba67d14d407adcf603d422c07236438083aa0f30 (diff)
downloadtor-5cf758764ee9460f9bda8f0494f311ace54c8616.tar.gz
tor-5cf758764ee9460f9bda8f0494f311ace54c8616.zip
Rate-limit warnings related to unrecognized MyFamily elements.
svn:r5204
-rw-r--r--src/or/main.c3
-rw-r--r--src/or/or.h3
-rw-r--r--src/or/router.c36
3 files changed, 34 insertions, 8 deletions
diff --git a/src/or/main.c b/src/or/main.c
index d6a24112d9..d05a5b828d 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -926,6 +926,7 @@ do_hup(void)
if (accounting_is_enabled(options))
accounting_record_bandwidth_usage(time(NULL));
+ router_reset_warnings();
routerlist_reset_warnings();
addressmap_clear_transient();
/* first, reload config variables, in case they've changed */
@@ -1382,7 +1383,7 @@ tor_free_all(int postfork)
connection_free_all();
if (!postfork) {
config_free_all();
- router_free_all_keys();
+ router_free_all();
}
tor_tls_free_all();
/* stuff in main.c */
diff --git a/src/or/or.h b/src/or/or.h
index e13db66c96..254de738b8 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2055,7 +2055,8 @@ int router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router,
crypto_pk_env_t *ident_key);
int is_legal_nickname(const char *s);
int is_legal_nickname_or_hexdigest(const char *s);
-void router_free_all_keys(void);
+void router_reset_warnings(void);
+void router_free_all(void);
/********************************* routerlist.c ***************************/
diff --git a/src/or/router.c b/src/or/router.c
index 5835c38aed..1475da03a0 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -756,6 +756,9 @@ router_get_my_descriptor(void)
return desc_routerinfo->signed_descriptor;
}
+/*DOCDOC*/
+static smartlist_t *warned_nonexistent_family = NULL;
+
/** If <b>force</b> is true, or our descriptor is out-of-date, rebuild
* a fresh routerinfo and signed server descriptor for this OR.
* Return 0 on success, -1 on error.
@@ -810,6 +813,8 @@ router_rebuild_descriptor(int force)
if (authdir_mode(options))
ri->is_verified = ri->is_named = 1; /* believe in yourself */
if (options->MyFamily) {
+ if (!warned_nonexistent_family)
+ warned_nonexistent_family = smartlist_create();
smartlist_t *family = smartlist_create();
ri->declared_family = smartlist_create();
smartlist_split_string(family, options->MyFamily, ",",
@@ -822,9 +827,12 @@ router_rebuild_descriptor(int force)
else
member = router_get_by_nickname(name, 1);
if (!member) {
- log_fn(LOG_WARN, "I have no descriptor for the router named \"%s\" "
- "in my declared family; I'll use the nickname verbatim, but "
- "this may confuse clients.", name);
+ if (!smartlist_string_isin(warned_nonexistent_family, name)) {
+ log_fn(LOG_WARN, "I have no descriptor for the router named \"%s\" "
+ "in my declared family; I'll use the nickname as is, but "
+ "this may confuse clients.", name);
+ smartlist_add(warned_nonexistent_family, tor_strdup(name));
+ }
smartlist_add(ri->declared_family, name);
name = NULL;
} else {
@@ -833,6 +841,8 @@ router_rebuild_descriptor(int force)
base16_encode(fp+1,HEX_DIGEST_LEN+1,
member->identity_digest, DIGEST_LEN);
smartlist_add(ri->declared_family, fp);
+ if (smartlist_string_isin(warned_nonexistent_family, name))
+ smartlist_string_remove(warned_nonexistent_family, name);
}
tor_free(name);
});
@@ -1135,9 +1145,20 @@ is_legal_nickname_or_hexdigest(const char *s)
return len == HEX_DIGEST_LEN+1 && strspn(s+1,HEX_CHARACTERS)==len-1;
}
-/** Release all resources held in router keys. */
+/** Forget that we have issued any router-related warnings, so that we'll
+ * warn again if we see the same errors. */
+void
+router_reset_warnings(void)
+{
+ if (warned_nonexistent_family) {
+ SMARTLIST_FOREACH(warned_nonexistent_family, char *, cp, tor_free(cp));
+ smartlist_clear(warned_nonexistent_family);
+ }
+}
+
+/** Release all static resources held in router.c */
void
-router_free_all_keys(void)
+router_free_all(void)
{
if (onionkey)
crypto_free_pk_env(onionkey);
@@ -1149,5 +1170,8 @@ router_free_all_keys(void)
tor_mutex_free(key_lock);
if (desc_routerinfo)
routerinfo_free(desc_routerinfo);
+ if (warned_nonexistent_family) {
+ SMARTLIST_FOREACH(warned_nonexistent_family, char *, cp, tor_free(cp));
+ smartlist_free(warned_nonexistent_family);
+ }
}
-