From 1d6db7ec3d319fe16b285cd540e3e25df74efd91 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 8 Jun 2007 19:02:39 +0000 Subject: [PATCH] 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 --- ChangeLog | 4 ++++ src/or/dirserv.c | 20 +++++++++++++++++++- src/or/dirvote.c | 11 +++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 889e34d3f4..63ee70a0e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 57c95e634f..612e2917ae 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: @@ -2195,6 +2204,15 @@ generate_networkstatus_opinion(int v2) goto done; } + { + 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) diff --git a/src/or/dirvote.c b/src/or/dirvote.c index ce7351c93e..19d8ef308d 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; }