diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 5d89b473d4..8be8a57757 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -1065,6 +1065,8 @@ static smartlist_t *pending_vote_list = NULL; /** DOCDOC */ static char *pending_consensus_body = NULL; /** DOCDOC */ +static char *pending_consensus_signatures = NULL; +/** DOCDOC */ static networkstatus_vote_t *pending_consensus = NULL; /** DOCDOC */ @@ -1177,7 +1179,7 @@ dirvote_compute_consensus(void) /* Have we got enough votes to try? */ int n_votes, n_voters; smartlist_t *votes = NULL; - char *consensus_body = NULL; + char *consensus_body = NULL, *signatures = NULL; networkstatus_vote_t *consensus = NULL; authority_cert_t *my_cert; @@ -1207,9 +1209,16 @@ dirvote_compute_consensus(void) log_warn(LD_DIR, "Couldn't parse consensus we generated!"); goto err; } + signatures = networkstatus_get_detached_signatures(consensus); + if (!signatures) { + log_warn(LD_DIR, "Couldn't extract signatures."); + goto err; + } tor_free(pending_consensus_body); pending_consensus_body = consensus_body; + tor_free(pending_consensus_signatures); + pending_consensus_signatures = signatures; if (pending_consensus) networkstatus_vote_free(pending_consensus); @@ -1220,8 +1229,25 @@ dirvote_compute_consensus(void) if (votes) smartlist_free(votes); tor_free(consensus_body); + tor_free(signatures); networkstatus_vote_free(consensus); return -1; } +/** Release all static storage held in dirvote.c */ +void +dirvote_free_all(void) +{ + dirvote_clear_pending_votes(); + if (pending_vote_list) { + smartlist_free(pending_vote_list); + pending_vote_list = NULL; + } + tor_free(pending_consensus_body); + tor_free(pending_consensus_signatures); + if (pending_consensus) { + networkstatus_vote_free(pending_consensus); + pending_consensus = NULL; + } +} diff --git a/src/or/main.c b/src/or/main.c index 6e449e0ef9..e252383074 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1764,6 +1764,7 @@ tor_free_all(int postfork) if (!postfork) { evdns_shutdown(1); } + dirvote_free_all(); routerlist_free_all(); addressmap_free_all(); set_exit_redirects(NULL); /* free the registered exit redirects */ diff --git a/src/or/or.h b/src/or/or.h index e54b39b96a..8b46391e7f 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2793,6 +2793,8 @@ format_networkstatus_vote(crypto_pk_env_t *private_key, /********************************* dirvote.c ************************/ +void dirvote_free_all(void); + /* vote manipulation */ void networkstatus_vote_free(networkstatus_vote_t *ns); char *networkstatus_compute_consensus(smartlist_t *votes,