diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-06-08 19:02:39 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-06-08 19:02:39 +0000 |
commit | 1d6db7ec3d319fe16b285cd540e3e25df74efd91 (patch) | |
tree | ecceafdddd80ab126013f890ce3d31cb70e23098 | |
parent | 2bb70054813876c5e3bd32606cdeac3971d60c5c (diff) | |
download | tor-1d6db7ec3d319fe16b285cd540e3e25df74efd91.tar tor-1d6db7ec3d319fe16b285cd540e3e25df74efd91.tar.gz |
r13325@catbus: nickm | 2007-06-08 15:02:37 -0400
Parse networkstatuses (v2, vote, and consensus) after generating them, and fail fast if there is a parse error.
svn:r10540
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/or/dirserv.c | 20 | ||||
-rw-r--r-- | src/or/dirvote.c | 11 |
3 files changed, 34 insertions, 1 deletions
@@ -6,6 +6,10 @@ Changes in version 0.2.0.3-alpha - 2007-??-?? - tor-gencert creates all files as readable to the file creator only, and write-protects the authority identity key. + o Minor features (directory authority): + - Fail quickly and (relatively) harmlessly if we generate a network + status document that is somehow malformed. + o Deprecated features: - RedirectExits is now deprecated. diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 57c95e634..612e2917a 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1983,10 +1983,19 @@ format_networkstatus_vote(crypto_pk_env_t *private_key, note_crypto_pk_op(SIGN_DIR); if (router_append_dirobj_signature(outp,endp-outp,digest,private_key)<0) { - log_warn(LD_BUG, "Unable to sign router status."); + log_warn(LD_BUG, "Unable to sign networkstatus vote."); goto err; } + { + networkstatus_vote_t *v; + if (!(v = networkstatus_parse_vote_from_string(status, 1))) { + log_err(LD_BUG,"Generated a networkstatus vote we couldn't parse."); + goto err; + } + networkstatus_vote_free(v); + } + goto done; err: @@ -2196,6 +2205,15 @@ generate_networkstatus_opinion(int v2) } { + networkstatus_t *ns; + if (!(ns = networkstatus_parse_from_string(status))) { + log_err(LD_BUG,"Generated a networkstatus we couldn't parse."); + goto done; + } + networkstatus_free(ns); + } + + { cached_dir_t **ns_ptr = &the_v2_networkstatus; if (*ns_ptr) cached_dir_decref(*ns_ptr); diff --git a/src/or/dirvote.c b/src/or/dirvote.c index ce7351c93..19d8ef308 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -623,6 +623,17 @@ networkstatus_compute_consensus(smartlist_t *votes, SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); + { + networkstatus_vote_t *c; + if (!(c = networkstatus_parse_vote_from_string(result, 0))) { + log_err(LD_BUG,"Generated a networkstatus consensus we couldn't " + "parse."); + tor_free(result); + return NULL; + } + networkstatus_vote_free(c); + } + return result; } |