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
This commit is contained in:
Nick Mathewson 2007-06-08 19:02:39 +00:00
parent 2bb7005481
commit 1d6db7ec3d
3 changed files with 34 additions and 1 deletions

View File

@ -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 - tor-gencert creates all files as readable to the file creator only, and
write-protects the authority identity key. 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: o Deprecated features:
- RedirectExits is now deprecated. - RedirectExits is now deprecated.

View File

@ -1983,10 +1983,19 @@ format_networkstatus_vote(crypto_pk_env_t *private_key,
note_crypto_pk_op(SIGN_DIR); note_crypto_pk_op(SIGN_DIR);
if (router_append_dirobj_signature(outp,endp-outp,digest,private_key)<0) { 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; 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; goto done;
err: err:
@ -2195,6 +2204,15 @@ generate_networkstatus_opinion(int v2)
goto done; 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; cached_dir_t **ns_ptr = &the_v2_networkstatus;
if (*ns_ptr) if (*ns_ptr)

View File

@ -623,6 +623,17 @@ networkstatus_compute_consensus(smartlist_t *votes,
SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
smartlist_free(chunks); 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; return result;
} }